質問
最近、同僚が開発した既存のサービス用の追加モジュールを開発する必要がありました。彼は、このレベルまでバブルしたすべての未処理の例外をキャッチし、スタックトレース情報などでログに記録するために、メイン作業関数にtry / catchブロックを配置しました。
try
{
// do main work
}
catch(Exception ex)
{
// log exception info
}
これによりプログラムが非常に安定しますが(「クラッシュする可能性が低い」など)、嫌いです。コードをテストしているときに例外が発生しないためです。もちろん、例外ログを見て新しいエントリがあるかどうかを確認できますが、例外がスローされた瞬間に例外を取得するという直接的なフィードバックを非常に好んでいます(コードの右行にカーソルを置いてください)。 / p>
少なくともトップレベルのtry / catchを削除しましたが、少なくともコーディングとテストを行っていました。しかし、今では私のタスクは終了しており、リリースのためにそれを戻すかどうかを決定する必要があります。
私はそれを行うべきだと思います、なぜならそれはサービスをより安定させるからです。そして、それの全体的なポイントは、何の監督も必要とせずにバックグラウンドで実行することです。一方、一般的な Exception
ではなく、特定の例外( IoException
など)のみを呼び出す必要があることを読みました。
この問題に関するアドバイスは何ですか?
ところで、プロジェクトはC#で記述されていますが、.NET以外の言語の回答にも興味があります。
解決
元に戻します。
例外は、テスト中にのみ関連する必要があります。それ以外の場合は、ユーザーにポップしても意味がありません。
ログは問題ありません。
さらに、デバッグビルド用にVisual Studioで定義されたDEBUGシンボルをフラグとして使用できます。
...
} catch( Exception e ) {
#if DEBUG
throw;
#else
log as usual
#endif
}
したがって、次回変更が必要な場合は、デバッグフラグをtrueに設定すると例外がポップアップ表示されます。
他のヒント
どのJavaアプリケーションでも、キャッチされない例外の例外ハンドラーを次のようなもので定義したいだけです。
Thread.setDefaultUncaughtExceptionHandler( ... );
これらのキャッチされなかった例外をキャッチするオブジェクトは、少なくとも失敗をログに記録するので、それについて知る機会があります。そうでない場合、メインスレッドでない限りではなく、スレッドが例外を取得したことさえ通知される保証はありません。
これに加えて、ほとんどのスレッドにはtry / catchがあり、 RunnableException
(ただし Error
ではありません)をキャッチしてログに記録します...これが発生するとスレッドが停止し、他のユーザーはログに記録して無視し、他のユーザーはアプリケーションのニーズに応じてユーザーに苦情を表示し、ユーザーに決定させます。このtry / catchは、スレッドのまさにルート、 Runnable.run()
メソッドまたは同等のものです。 try / catchはスレッドのルートにあるため、時々このcatchを無効にする必要はありません。
C#で記述する場合、同様にコーディングします。しかし、これはすべてアプリケーションの必要性に依存します。例外はデータを破損する例外ですか?それでは、キャッチして無視しないでください。常にログに記録しますが、その後アプリケーションを停止させます。ただし、ほとんどの例外はこの種のものではありません。
理想的には、発生した場所のできるだけ近くで例外を処理したいのですが、それはグローバルな例外ハンドラが悪い考えであることを意味しません。特に、すべてのコストで実行し続ける必要があるサービスの場合。私はあなたがしてきたことを続けます。デバッグ中は無効にしますが、本番環境ではそのままにしておきます。
セーフティネットとして使用する必要があることに留意してください。例外がそこまで上昇する前に、すべての例外をキャッチするようにしてください。
すべての例外をキャッチし、プログラムを「安定」にしたいという衝動は非常に強く、アイデアは誰にとっても非常に魅力的です。あなたが指摘する問題は、これは単なる策略であり、プログラムはバグがあり、さらに悪いことに、失敗の兆候がないことです。誰も定期的にログを監視しません。
私のアドバイスは、他の開発者に広範なテストを行って、それを外部のキャッチなしで本番環境に展開するように説得することです。
例外が発生したときに表示する場合は、Visual Studioで[デバッグ]メニューに移動し、[例外]を選択して、例外がスローされるとすぐにブレークするようデバッガーに指示できます。どんな種類の例外を選択することもできます。 :)