捕获在没有 try/catch 的情况下引发的异常
Catching exceptions thrown without try/catch
我记得读过关于如何在不使用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 头文件中的函数。
相关文章:
- 如何在编译器方便的情况下在 C/C++ 中发布算术溢出异常
- 如何避免字符串到整数转换情况下的无效参数异常
- 在存在异常的情况下使用for_each? std::exception_list
- C++:在没有活动异常(GCC)的情况下终止调用
- 在scoped_ptr发生异常的情况下未调用析构函数
- C++ 异常情况下的错误 C2228(".val"的左侧必须具有类/结构/联合)
- C++线程:在没有活动异常的情况下终止调用
- 'new'语句是否可以在不引发异常的情况下失败?
- 如何在不调试符号的情况下确定从外部库引发的异常
- C++:检查是否在没有外部库的情况下抛出了某个异常类型
- 在什么情况下,if语句可以抛出异常
- catch语句如何在没有反射的情况下识别异常类型
- 应用程序在未附加调试器的情况下引发异常
- 如何在不将字符串对象嵌入自定义异常类的情况下重新格式化错误消息
- Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配
- 在没有活动异常的情况下调用c++终止
- 在没有活动异常线程的情况下终止调用
- 为什么 lock() 在死锁的情况下不抛出异常
- 在低内存情况下使用带有异常处理的STL容器
- 不同的异常在相同的情况下MFC/Sql