ここには2つの異なる考え方があり、両方の支持者はしばしばショックを受け、誰もが他の方法を信じることができることに驚いています。結局のところ、それは好みの問題であり、ターゲットユーザーベースが何を期待および/または受け入れる意思があるか、そしてさらに重要なことに、アプリケーションが何をするかをどれだけよく知っているかです。(あなたの質問は、関係するすべてのコードを記述しなかったことを意味します。そのため、最後のビットはあなたが思っているよりも難しいかもしれません。)
まず、ここでは、クラスライブラリではなく、エンドユーザーアプリケーションについて話していると思います。明示的に処理していないクラスライブラリで例外をキャッチする正当な理由はほとんどありません。あなたは常にその決定を発信者に任せます。
ただし、エンドユーザーアプリケーションでは、コールチェーンの上位に誰もいないため、最終的にはあなたが決定します。この場合、2つの幅広いオプションがあります。
早く失敗する
エラーが発生した場合は、物理的にできるだけ早くアプリケーションをクラッシュさせる方がよいと考える人もいます。少し逆効果に思えますが、未処理の例外が発生することの意味を覚えておいてください。文字通り、何がうまくいかなかったのかわかりません。エラーロギングコードのような単純なものでさえ、予期しない方法で動作する可能性があります。
呼び出しサイトで例外を適切に処理している場合、この種の「予期しない」エラーは、メモリ不足、スタックの破損など、本当に本当に悪いことが起こったときにのみ受け取る必要があります。実際には回復できないようなものです。 、何があっても、試してみても意味がありません。
優雅に失敗する
他の人々は、ユーザーが情報を失うのを防ぐために、可能な限りエラーを分離するように努めるべきだと信じています。アプリケーションが十分にモジュール化されている場合、ある領域での完全な障害が別の領域のデータにまったく影響を与えない可能性があります。
これはよりリスクの高い提案です。一貫性のない状態に陥らないように十分に注意する必要があります。確かに、失敗したコードの何もコードの他の部分から状態を変更していないことを知っている必要があります。
結論は
いつものように、「正しい」答えはおそらく真ん中のどこかにあります。一般に、一貫性のない状態で実行されるリスクは、ほとんどの場合、アプリケーションを停止させる正当な理由です。もちろん、ここでもある程度のロギングを実行することをお勧めします。これは、いくつかの方法で実行できます。私の好みは、これに例外を使用することではなく、this、this、またはthisのようなトップレベルのさまざまな「未処理の例外」イベントにフックすることです。これらのイベントハンドラーに例外を記録し、「よりわかりやすい」エラーダイアログを表示してから、アプリケーションをシャットダウンします。たとえば、これに似たものを、作成するWPFアプリケーションに配置します。
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="UnhandledException">
private void UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
logger.FatalException("OH NOES! Bad stuff happened, bailing out.", e.Exception);
MessageBox.Show("holy cow something bad happened:\r\n" + e.Exception.Message);
}
ただし、すべての例外をキャッチしても安全な場合があります。これは主に、何があってもすべてのデータが破棄される場所に限定されます。たとえば、すでに完了した操作の結果を印刷またはエクスポートすると、アプリケーションの他の部分に悪影響を与えることなく、「安全に」失敗する可能性があります。ユーザーがプリンターを持っていないという理由だけでアプリケーションがクラッシュすることはおそらく望ましくありません。(サードパーティの印刷ライブラリが1つあり、明示的System.Exception
にエラーが発生する場合もあります...)しかし、自分が何をしているのかを理解し、データが他のデータから完全に分離されていることに十分注意する必要があります。システムの。