首页 > 解决方案 > c++中未处理的异常处理程序

问题描述

我正在开发一个 C++ 库,我希望能够捕获发生的任何未被 try/catch 语句捕获的异常。

在谷歌搜索时我唯一能找到的是一个 catch(...) 块,但这不起作用,我希望库能够捕获通常会导致崩溃的任何东西。就像 C# 中的未处理异常处理程序一样。

尽管在 C++ 中有任何类型的事件处理程序,但它看起来并不像这样。我想的是在SIGSEGVAND之类的东西上注册一个信号处理程序SIGABRT,然后当我收到信号时,处理崩溃。

这是最好的方法还是有其他选择可以做我想要实现的目标?

标签: c++unhandled-exception

解决方案


我设法找到了一种在某种程度上实现这一点的方法。

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 调试器中运行。


推荐阅读