如何在构造函数或重载运算符中捕获异常



所以我有一个实现分数的类。我必须添加catch&抛出到构造函数(如果分母为零(和除法的重载运算符(如果除以零(。我该如何认识到这一点?但我需要catch块覆盖这个构造函数,因为我需要停止创建这个对象。

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();
}

不要在构造函数中放入try/catch。如果在构造函数中catch异常,则将创建对象

如果denominator无效,则Rational对象将无效,不应创建。try/catch应该位于尝试创建Rational对象的代码周围。

如果您的Rational对象是用new分配的,那么系统将自动解除分配给Rational的内存,然后为您重新抛出catch的异常。

我不确定我是否理解你的问题。防止类被构造的唯一方法是抛出异常,而不是捕获它。

您可以简单地将异常抛出try/catch块之外。

最新更新