捕获没有try / catch抛出的异常

时间:2011-05-14 21:02:35

标签: c++ exception exception-handling error-handling diagnostics

我记得读过如何在不使用try / catch的情况下捕获异常。基本上,当通过derefencing空指针抛出异常(例如“未处理的异常”)时,即使没有为异常编写try / catch,也会触发一个进程。我认为它与您编写的顶级库有关,然后包含在您的代码中。不幸的是,关于这种方法的文档似乎不存在,但我已经看到/听说过这样的方法之前已经完成。有人可以解释一下这是怎么做的吗?

3 个答案:

答案 0 :(得分:7)

在C ++中,取消引用空指针会导致未定义的行为,这并不一定意味着抛出异常。例如,在Unix系统上,会引发SIGSEGV信号。

在Windows上,访问冲突会引发SEH异常。 SEH异常与C ++异常不同;它们使用__try/__except语句处理(而不是try/catch语句)。未处理的SEH异常会调用未处理的异常过滤器,您可以使用SetUnhandledExceptionFilter进行设置。

#include <Windows.h>
#include <iostream>

LONG WINAPI MyFilter(EXCEPTION_POINTERS * /*ExceptionInfo*/)
{
    std::cout << "An uncaught exception was detected!\n";

    // Ultimately causes Windows Error Reporting to be invoked.
    // Use EXCEPTION_EXECUTE_HANDLER to silently terminate the application.
    return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
    SetUnhandledExceptionFilter(MyFilter);
    *(char volatile *)0 = 0;
}

答案 1 :(得分:2)

您可能正在考虑使用Windows Structured Exception Handling机制。在支持完整的C ++ try / catch语义的情况下,我个人还没有找到任何合理的用例。

答案 2 :(得分:1)

这是一个操作系统实现细节,取消引用空指针不会生成C ++异常。在生成SEH异常的Windows上,MSVC编译器允许您使用非标准__try和__except关键字处理它们。在生成信号的* nix上,使用signal.h头文件中的函数。