一部の社内コードにはBoostを使用しています。でmain()
、プログラムを終了する前に、すべてのboost::exceptionsをキャッチしてログに記録したいと思います。
ロギングのために、boost :: exceptionsをキャッチし、例外情報を文字列として取得するにはどうすればよいですか?
をご覧になることをお勧めしますboost::diagnostic_information
。
これがあなたのための例です。それは決して完全ではなく、あなたが望むことを正確に行うためにいくつかのカスタマイズが必要になります。
void main()
{
try
{
// Your code that can throw.
}
catch (const boost::exception& ex)
{
// Output some debug information.
std::cerr << boost::diagnostic_information(ex) << std::endl;
// Here we can choose to perform some graceful-shutdown activities,
// and/or rethrow the exception, triggering a call to std::terminate().
throw; // Rethrow.
}
catch (const std::exception& ex)
{
// Let's do the same for std::exception just for comparison.
std::cerr << ex.what() << std::endl;
throw; // Rethrow.
}
}
おそらくこれをカスタマイズする必要がある場所:
メインで再スローすると、がトリガーされstd::terminate()
ます。コードをより適切にシャットダウンするいくつかのタスクを実行することをお勧めします。
std::cerr
この種の情報を送信するのに最適な場所ではない可能性があります。おそらくあなたはそれをファイルに記録したいと思うでしょう。または、 std::cerrをファイルにリダイレクトしたい場合もあります。
コードは、boost::exception
またはではないものをスローする可能性がありstd::exception
ます。たぶんあなたはそのためのすべてをキャッチしたいです:catch (...)
これはtry-catchブロックであり、アプリケーションのメインスレッドでのみ機能することに注意してください。処理されない例外をスローする可能性のある他のスレッドのエントリポイントでも、同様のことを行う必要があります。
これは、アプリケーション全体での適切な例外処理に代わるものではありません。