【问题标题】:How can I catch runtime error in C++如何在 C++ 中捕获运行时错误
【发布时间】:2011-02-04 15:40:46
【问题描述】:

参考C++ catching all exceptions

try {
    int i = 0;
    int j = 0/i; /* Division by  0 */
    int *k = 0;
    std::cout << *k << std::endl;  /* De-reference invalid memory location. */
}
catch (...) {
    std::cout << "Opps!" << std::endl;
}

无法检测到上述运行时错误。或者,我对 C++ 异常处理功能有错误的期望吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果你取消引用一个不指向对象的指针,你不会得到异常,你会得到未定义的行为。任何事情都有可能发生。

    通常,如果您取消引用空指针,就像您在示例中所做的那样,程序将崩溃。

    【讨论】:

    • 谢谢。看起来我正在混合 Java 的异常系统和 C++ 的异常。
    【解决方案2】:

    当你运行这个程序时(至少在我的系统上运行它时),你不会抛出 C++ 异常;您实际上是在对标准 C 库进行分段错误。库中的分段错误不是 C++ 异常,因此 C++ 运行时没有什么可捕获的。

    将此程序与 C# 或 Java 中的等效程序进行对比,不同之处在于它们各自的运行时将处理这些错误运行时异常,并且不会对任何外部库进行分段错误。

    【讨论】:

    • 实际上,当他们对外部库进行段错误(这非常罕见)时,程序会终止......
    【解决方案3】:

    /EHa 是让 Visual Studio 将 SEH 异常视为 C++ 异常的神奇编译器开关。然后你可以“捕获”访问冲突并除以零异常。

    通常不建议这样做。

    【讨论】:

    • 酷!我从不知道 /EHa 选项。
    • 好东西,我也不知道这个
    【解决方案4】:

    C++ 给你的运行时环境很薄。在大多数情况下,它会做你编程它要做的事情,并且不会做你没有编程它做的事情。您可以为指针编写一个包装器,当您取消引用空指针时,它会进行检查。事实上,boost::shared_ptr&lt;&gt; 在取消引用时确实断言不等于 null,因此在提供调试时所需的额外信息的同时,您可以获得与本机指针类似的性能。

    【讨论】:

      【解决方案5】:

      这些不是 C++ 异常。这些是操作系统异常。如果您使用的是 Windows,则可以启用异步异常模型(/EHa 标志)并捕获 Win32 异常。

      【讨论】:

        猜你喜欢
        • 2012-04-15
        • 2023-03-08
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        相关资源
        最近更新 更多