我记得读过有关如何在不使用 try/catch 的情况下捕获异常的文章。基本上,当通过取消引用空指针引发诸如“未处理的异常”之类的异常时,即使没有为异常编码 try/catch,也会触发一个进程。我相信它与您编写然后包含在代码中的顶级库有关。不幸的是,关于这种方法的文档似乎不存在,但我以前见过/听说过这种方法。有人可以解释一下这是怎么做到的吗?
问问题
4936 次
3 回答
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;
}
于 2011-05-14T21:09:46.950 回答
2
您可能会想到 Windows结构化异常处理机制。由于支持完整的 C++ try/catch 语义,我个人还没有找到任何合理的用例。
于 2011-05-14T21:07:32.707 回答
1
这是一个操作系统实现细节,取消引用空指针不会产生 C++ 异常。在生成 SEH 异常的 Windows 上,MSVC 编译器允许您使用非标准的 __try 和 __except 关键字来处理它们。在生成信号的 *nix 上,您使用 signal.h 头文件中的函数。
于 2011-05-14T21:10:35.103 回答