我正在C ++库上工作,我希望能够捕获try / catch语句未捕获的任何异常。
我在Googling周围唯一能找到的是catch(...)块,但这是行不通的,我希望库捕获任何通常会导致崩溃的东西。就像C#中未处理的异常处理程序一样。
尽管在c ++中没有像这样的任何事件处理程序,但它看起来并不像。相反,我当时想的是在SIGSEGV
和SIGABRT
之类的东西上注册信号处理程序,然后在收到信号时处理崩溃。
这是最好的方法吗?或者是否有其他选择可以实现我想要实现的目标?
答案 0 :(得分:0)
我设法找到一种在某种程度上实施该方法的方法。
正如@ 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 stacktrace返回记录的回溯。
请注意,虽然在Visual Studio中运行时执行此操作,但VS在触发终止处理程序之前捕获了崩溃并停止了终止触发器的触发,因此要解决此问题,您需要使用ctrl + F5运行以避免它在内部运行VS调试器。