我目前正在遵循C++核心准则,将代码中的所有析构函数设置为noexcept
。我的一些析构函数可能会引发异常 - 在这种情况下,我希望程序崩溃并提供有关导致崩溃的原因的详细信息。在析构函数上设置noexcept
说明符将调用std::terminate()
进而调用默认terminate_handler
。默认terminate_handler
将打印在析构函数内部触发的异常。这在抛出另一个异常时未调用抛出析构函数的情况下非常有用。在这种情况下,我希望terminate_handler
打印这两个异常,以便我首先知道是什么触发了错误处理路径。
问题是我似乎无法在标准库中找到获取未捕获异常的方法。有一个std::current_exception()
函数获取正在处理的异常,std::uncaught_exceptions()
函数仅获取未捕获的异常数。我想得到一个std::exception_ptr
或其他东西来对待未捕获的异常。这可能吗?
参见:https://www.danielseither.de/blog/2013/12/globally-handling-uncaught-exceptions-and-signals-in-c/
std::exception_ptr exptr = std::current_exception();
try {
std::rethrow_exception(exptr);
}
catch (std::exception &ex) {
std::fprintf(stderr, "Terminated due to exception: %sn", ex.what());
}