7

当我的应用程序中发生未捕获的异常时,我可以通过向我的函数what()添加全局来获取异常的字符串,例如:catchmain()

catch (std::exception& ex)
{
    std::cerr << "Error: " << ex.what() << "\n";
}

backtrace()我还可以通过调用和backtrace_symbol()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);

但是,当我尝试通过throw;在我的 global 中重新抛出异常来组合这两种方法时catch,我得到的堆栈跟踪是那个catch,而不是最初抛出异常的位置。

有什么方法可以同时做到这两个(获取最初抛出异常的位置的堆栈跟踪并获取它的值what())吗?

4

1 回答 1

1

这应该有效:

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;}
}
于 2013-09-18T16:57:35.590 回答