c++ - 为什么在我的 C++ 代码中会抛出这个异常?

标签 c++ exception try-catch

我正在分析我讲座中的部分代码。 我设法编译了它,但我无法理解: 为什么我的程序输出“Wyjatek”和 0 而不是“WyjatekNieoznaczony”?

我很确定 WyjatekNieoznaczony() 应该被抛出,因为 a=0 和 b=0 也是如此。现在我有点困惑。 你能帮帮我吗?

class Wyjatek {};
class WyjatekBledny : public Wyjatek {};
class WyjatekNieoznaczony : public Wyjatek {};

double f(double a, double b) {
    if (b == 0) {
        if (a == 0)
            throw WyjatekNieoznaczony();
        else
            throw WyjatekBledny();
    }
    return a / b;
}


double g(double a, double b) throw (int) {
    try {
        return f(a, b);
    }
    catch (WyjatekBledny) {
        cout << "Wyjatek bledny" << endl;
        throw 1;
    }
    catch (Wyjatek) {
        cout << "Wyjatek" << endl;
    }
    catch (WyjatekNieoznaczony) {
        cout << "Wyjatek nieoznaczony" << endl;
        throw;
    }
    return 0;
}

int main()
{
    double a = 0, b = 0;
    try {
        cout << g(a, b) << endl;
    }
    catch (...)
    {
        cout << "Inny wyjatek" << endl;
    }
    system("pause");
    return 0;
}

最佳答案

是的,确实抛出了 WyjatekNieoznaczony,但在捕获站点,catch (Wyjatek) { 是一个匹配项(由于继承),所以它被捕获在那里。

catch 站点在行为上更像是一个 if else block - 每个 catch 可能性都按照它们被编写的顺序考虑 -而不是 switch block ,您可以在其中按您喜欢的任何顺序放置标签。

另请注意,通过 const 引用而不是通过值来捕获异常是一个好主意,否则您可能会遭受对象切片的陷阱。

关于c++ - 为什么在我的 C++ 代码中会抛出这个异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56835428/

相关文章:

java - 没有编译器错误的多个返回语句

c++ - OpenCV - 来自相机的实时反馈不流畅

c++ - 具有 2 种不同类型的对象的重载运算符声明

c++ - 编译我的第一个 C++ 程序时遇到问题

c# - 非托管 C++ 应用程序中性能更好的 WPF 对话框

arrays - F# Array.FindIndex 异常处理

java - CQ5 无法更新过时的项目 : item. save() javax.jcr.InvalidItemStateException : Unable to update a stale item: item. save()

Android "java.lang.RuntimeException: Unable to instantiate activity"异常

php - 返回,内部或外部尝试/捕获?

java - 验证月份输入 01 和 1?