c++ - c++中未处理的异常处理程序
问题描述
我正在开发一个 C++ 库,我希望能够捕获发生的任何未被 try/catch 语句捕获的异常。
在谷歌搜索时我唯一能找到的是一个 catch(...) 块,但这不起作用,我希望库能够捕获通常会导致崩溃的任何东西。就像 C# 中的未处理异常处理程序一样。
尽管在 C++ 中有任何类型的事件处理程序,但它看起来并不像这样。我想的是在SIGSEGV
AND之类的东西上注册一个信号处理程序SIGABRT
,然后当我收到信号时,处理崩溃。
这是最好的方法还是有其他选择可以做我想要实现的目标?
解决方案
我设法找到了一种在某种程度上实现这一点的方法。
sigsegv
正如@user4581301 指出的那样,如果出现可能导致的指针问题或内存问题,或者好像发生这种情况,我可能无法做任何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 调试器中运行。
推荐阅读
- oracle - 在 Oracle 中设置新服务。本地连接有效,但远程无效
- angular - component.ts 文件中的代码不是按顺序执行的
- tensorflow - 如何将我的消息作为输入插入到 Tensorflow 包的 SVM 估计器的特征列中
- javascript - IONIC 无法设置令牌
- pandas - 用什么代替 pandas.Series.filter?
- python - 无论在哪里使用,如何让我的 python 脚本找到 chromedriver 文件
- java - Dagger 2 - 如果没有 @Provides-annotated 方法就无法提供
- html - 双色背景显示两列
- visual-studio - 无法安装nuget包
- spring-boot - 通过Vue axios将数据作为对象发布到spring后端服务器