C++ 中未处理的异常处理程序
Unhandled Exception Handler in c++
我正在开发一个C++库,我希望能够捕获任何未被try/catch语句捕获的异常。
在谷歌搜索时,我唯一能找到的就是一个catch(...)块,但这行不通,我希望库能够捕获任何通常会导致崩溃的东西。就像 C# 中未经处理的异常处理程序一样。
看起来不像在 c++ 中有任何这样的事件处理程序。相反,我在想的是SIGSEGV
和SIGABRT
之类的东西注册一个信号处理程序,然后在我收到信号时处理崩溃。
这是最好的方法,还是还有其他选择来实现我想要实现的目标?
我已经设法找到了一种方法来在某种程度上实现这一点。
正如@user4581301指出的那样,如果指针问题或内存问题可能导致sigsegv
或sigabrt
,我可能无法做任何事情,因为如果发生这种情况,主应用程序可能不可逆转地搞砸了,所以无法做任何远程有用的事情。
但是,如果抛出未捕获的异常,我找到了捕获它的方法。
当我的库初始化时,我执行以下操作:
if (currentTerminationHandler == nullptr)
{
currentTerminationHandler = std::get_terminate();
std::set_terminate(&unhandledTerminateHandler);
}
然后,unhandledTerminateHandler 方法在 https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace.html 处使用 boost 堆栈跟踪返回记录的回溯跟踪。
请注意,在 Visual Studio 中运行时执行此操作时,VS 会在触发终止处理程序之前捕获崩溃并阻止终止触发器触发,因此要解决此问题,您需要使用 ctrl+F5 运行以避免它在 VS 调试器中运行。
相关文章:
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 在C++程序中使用的迭代器中未处理的异常
- 我的控制台处理程序不处理 CTRL+C,即使设置正确
- 从终止处理程序访问所有未捕获的异常
- 处理程序在处理 SIGWINCH 后挂起
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- 核心消息传递中未处理的异常.dll在程序关闭期间
- C++ 程序中双链表的未处理异常
- 为什么我需要在多线程程序中使用pthread_sigmask来确保设置处理程序正在处理信号
- 命令和UPDATE_COMMAND_UI处理程序未在 MFC dll 中调用
- 文本框为空时C++ Windows 窗体应用程序未处理的异常错误
- 内联 asm 分配给"FS:0":处理程序未注册为安全处理程序
- 从其处理程序或处理程序 dtor 销毁 boost::asio 计时器是否安全?
- WM_PAINT处理程序未按预期执行,则会出现类似闪烁的效果
- C#程序,用于使用关闭前事件处理程序自动处理excel,而不保存编辑后的excel文件
- llvm异常;Catch处理程序未处理,未调用清理
- 如何在 onCommand 处理程序中处理转义和返回键>
- Boost进程库asynch_read处理程序未被调用
- 消息处理程序未调用窗口过程
- 文件处理错误(未处理异常)