c++ - 对于未捕获的异常,如何同时获取 what() 和回溯?

标签 c++ exception gcc

当我的应用程序中发生未捕获的异常时,我可以通过将全局 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/

相关文章:

c++ - 给定 2 个点和从第一个点到我必须找到的点的范围。如何找到我必须找到的点(在3D空间上)

c++ - 如何在 C++ 中找到数组的最小和唯一元素?

c++ - 迭代过去 container.end() 时的 std::transform 行为

python - 自定义异常默认日志记录

c++ - GCC 6.x 关于 lambda 可见性的警告

c++ - 为什么要使用虚函数?

java - NoSuchMethodException : getProperties on jar execution

c++ - 抛出的对象复制构造——为什么?

linux - gcc:错误:选项 ‘-mabi=aapcs-linux’中无法识别的参数

c - pthread_create 导致段错误