捕获在没有 try/catch 的情况下引发的异常

Catching exceptions thrown without try/catch

本文关键字:情况下 异常 catch try      更新时间:2023-10-16

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

在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;
}

您可能正在考虑Windows结构化异常处理机制。在支持完整的C++尝试/捕获语义的情况下,我个人还没有找到任何合理的用例。

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