如何在C ++中捕获运行时错误

时间:2010-04-06 02:14:19

标签: c++

参考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 ++异常处理功能有错误的期望吗?

5 个答案:

答案 0 :(得分:7)

如果取消引用不指向对象的指针,则不会出现异常,您将获得未定义的行为。任何事情都可能发生。

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

答案 1 :(得分:3)

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

通常不建议这样做。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

C ++给你的运行时环境非常薄。在大多数情况下,它会执行您为其编程的操作,并且不会执行您不编程的操作。您可以为指针编写一个包装器,当您取消引用空指针时将对其进行检查。实际上,boost::shared_ptr<>在取消引用它时会断言不等于null,因此您可以获得与本机指针类似的性能,同时提供您在调试时所需的额外信息。