Как отловить исключения в конструкторе или перегруженном операторе?

Итак, у меня есть класс, в котором реализованы дроби. Я должен добавить 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 ответа


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

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

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


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

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


Есть идеи?

10000