Как отловить исключения в конструкторе или перегруженном операторе? - PullRequest
0 голосов
/ 24 марта 2020

Итак, у меня есть класс, который реализовал дроби. Я должен добавить catch & throw к конструктору (в случае, если знаменатель равен нулю) и к перегруженному оператору деления (в случае деления на ноль). Как мне это понять? Но мне нужно перехватить блок над этим конструктором, потому что мне нужно прекратить создание этого объекта.

class Rational{
public:
    Rational(const int num, const int den){
    try{  
        numerator = num;
        denominator = den;
        if( denominator == 0){
            throw invalid_argument(" den is zero ")
      }
    }
    catch (invalid_argument& e){
        cout << e.what() << endl;
      }
  }
// I mean I want smth like that
try {
    Rational operator/(const Rational& lhs, const Rational& rhs) {

        return Rational{ lhs.Numerator() * rhs.Denominator(), lhs.Denominator() * rhs.Numerator() };

        if (rhs.Numerator() == 0) {
            throw domain_error("dividing by zero");
        }

    }
}
catch (const domain_error& e) {
    cout << e.what();
}

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Не помещайте try / catch в конструктор. Если вы catch исключений в конструкторе, то объект будет создан.

Если ваш denominator недействителен, то ваш Rational объект будет недействительным и не должен быть создан , try / catch должен быть вокруг кода, который пытается создать объект Rational.

Если объект Rational выделен с new, тогда система автоматически освободит память, выделенную для Rational и затем сбросить исключение для вас на catch.

2 голосов
/ 24 марта 2020

Я не уверен, что понимаю ваш вопрос. Единственный способ предотвратить создание класса - это сгенерировать исключение и не перехватить его.

Вы можете просто сгенерировать исключение вне блока try / catch.

...