当我的应用程序中发生未捕获的异常时,我可以通过将全局 catch
添加到我的 main() 来获取异常的
函数,类似于:what()
字符串
catch (std::exception& ex)
{
std::cerr << "Error: " << ex.what() << "\n";
}
我还可以通过从 std::terminate()
处理程序(通过调用 std::set_terminate()
设置)。例如(忽略内存泄漏):
void terminate_handler()
{
void** buffer = new void*[15];
int count = backtrace(buffer, 15);
backtrace_symbols_fd(buffer, count, STDERR_FILENO);
}
…
std::set_terminate(terminate_handler);
但是当我尝试通过在我的全局 catch
中使用 throw;
重新抛出异常来结合这两种方法时,我得到了那个 catch 的堆栈跟踪
,而不是原来抛出异常的位置。
有没有什么方法可以同时做到这两点(获取最初抛出异常的位置的堆栈跟踪并获取其 what()
的值)?
最佳答案
这应该有效:
void terminate_handler()
{
void** buffer = new void*[15];
int count = backtrace(buffer, 15);
backtrace_symbols_fd(buffer, count, STDERR_FILENO);
//etc.
auto ptr = std::current_exception();
try { std::rethrow_exception(ptr); }
catch (std::exception & p) { std::cout << p.what() << std::endl;}
}
关于c++ - 对于未捕获的异常,如何同时获取 what() 和回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18876058/