0

一部の社内コードにはBoostを使用しています。でmain()、プログラムを終了する前に、すべてのboost::exceptionsをキャッチしてログに記録したいと思います。

ロギングのために、boost :: exceptionsをキャッチし、例外情報を文字列として取得するにはどうすればよいですか?

4

1 に答える 1

3

をご覧になることをお勧めします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ブロックであり、アプリケーションのメインスレッドでのみ機能することに注意してください。処理されない例外をスローする可能性のある他のスレッドのエントリポイントでも、同様のことを行う必要があります。

  • これは、アプリケーション全体での適切な例外処理に代わるものではありません。

于 2013-01-01T18:27:40.667 に答える