アプリケーションでキャッチされない例外が発生した場合、次のような関数に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()
)。