7

アプリケーションでキャッチされない例外が発生した場合、次のような関数にwhat()グローバルcatchを追加することで、例外の文字列を取得できます。main()

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で例外を再スローして 2 つのアプローチを組み合わせようとすると、例外が最初にスローされた場所ではなく、catchその へのスタック トレースが取得されます。catch

両方を同時に実行できる方法はありますか (例外が最初にスローされた場所のスタック トレースを取得し、その値も取得しますwhat())。

4

1 に答える 1