使用Throw和Catch的未处理异常运行时错误

Unhandled exception runtime error using Throw and Catch

本文关键字:未处理 异常 运行时错误 Catch Throw 使用      更新时间:2023-10-16

所以我想我理解Throw and Catch,但我不确定。我用它来捕捉除零错误,并在网上看了其他例子,但每次我尝试我的抛出一个未处理的异常错误。我根据赋值的要求在构造函数中使用throw函数,然后尝试在int main中捕获它。有人知道为什么我得到这个运行时错误关于未处理的异常吗?构造函数

Rational(int n, int d)
{       
    num = n;
    denom = d;
    normalize();
    if (d == 0) {
        throw "Divide by Zero";     
    }       
}
Int Main() code
int main()
{
int case_count, a, b, c, d;
cin >> case_count;
for (int i = 0; i < case_count; ++i) {
    cout << "Case " << i << "n";
    cin >> a;
    cin >> b;
    cin >> c;
    cin >> d;
    Rational frac1(a, b);
    Rational frac2(c, d);
    Rational add;
    Rational sub;
    Rational mult;
    Rational div;
    try {
        add = frac1 + frac2;
        sub = frac1 - frac2;
        mult = frac1 * frac2;
        div = frac1 / frac2;

    }
    catch (const char* msg) {
        cout << msg;
    }
    cout << add << " ";
    cout << sub << " ";
    cout << mult << " ";
    cout << div << " ";
    cout << (frac1 < frac2) << "n";
    cout << frac1.toDecimal() << " ";
    cout << frac2.toDecimal() << "n";
}
return 0;
}

Rational构造函数抛出异常,因此,必须在try语句中创建Rational对象。在此语句之外创建了许多对象,因此此处抛出的任何异常都是未处理的。

您需要在try语句中创建对象。此外,正如OP中所述,您需要以更好的方式处理异常:

Rational::Rational(int n, int d)
{       
    num = n;
    denom = d;
    normalize();
    if (d == 0) {
        throw std::overflow_error("Divide by zero exception");
    }       
}

然后做:

try {
    Rational frac1(a, b);
    Rational frac2(c, d);
    Rational add;
    Rational sub;
    Rational mult;
    Rational div;
    add = frac1 + frac2;
    sub = frac1 - frac2;
    mult = frac1 * frac2;
    div = frac1 / frac2;
}
catch (std::overflow_error e) {
    cout << e.what();
}

在构造函数中抛出异常,特别是接受两个int s的异常。因此,您必须将该代码放在try块中。

try {
    Rational frac1(a, b);
}
catch (const char* msg) {
    cout << msg;
}