例外

2009-02-20 98 views
5

私はこのようなコードがある場合:何のクリーンアップを想定していない例外

void a() 
{ 
    try 
    { 
     b(); 
    } 
    catch (MyException) 
    { 
     // Handle any problems that occurred in b(c(d())) 
    } 
} 

void b() 
{ 
    c(); 
    // Do something else 
} 

void c() 
{ 
    d(); 
    // Do something else 
} 

void d() 
{ 
    // Do something, throw a MyException if it fails 
} 

は、任意の時点で必要であり、それは、try {}キャッチ置くのがベストです{スローを;} c()のd()呼び出しとb()のc()呼び出しの間にd()バブルから例外を自然に取り除くことはOKと見なされますブロック?

余分なtry/catchブロックが一種の「ドキュメント」として機能すると思われますが、余計なように見えるので、他の人が最良の方法を考えると思っています。

申し訳ありませんこれはあまりにも基本的すぎる場合は、私は例外の周りに私の頭を取得しようとしているが、私はまだ彼らのための良い感じを持っていないようです。

+0

http://stackoverflow.com/questions/22623/-net-throwing-exceptions-best-practicesに関連する – gimpf

答えて

13

あなたがそれを処理できるようになるまで伝播してください。あなたがそれを扱うことができなければ、それをつかむことはありません。だから問題は、効果的にc()メソッド内の例外を処理できますか?

0

私は、あなたがその情報をどうしたいかによって決まります。

私はいつもソースにできるだけ近いところで問題をキャッチしようとしています。なぜそれが起こったのかを対処しようとするのではなく、問題をすべて取り戻すのはなぜですか?コードの読みやすさと理解のために、私はtry/catchを可能な限り問題の原因に近いものと信じています。

プログラムを自分で作成していて、誰もそれに触れる人がいない場合は、あなたとコードに最適な方法を実行してください。

3

基本的には、これは、これらの状況を処理するための推奨された方法ではありません。

例外をキャッチするには、例外を処理して適切な処理を行うか、呼び出しスタックの上位にある呼び出し元に(より一般的な例外でカプセル化して)詳細情報を提供する必要があります。あなたがそれを行うことができない場合は、誰かがそれを適切に処理できるようになるまで、例外をコールスタックにバブルアップさせるべきです。

3

例外の大きな利点は、あなたが問題を処理できることです。見つからないファイルが検出されたか、関数の呼び出し元または呼び出し元の& cにあります。

ただし、の場合は、もチェーンに沿って処理されます。これらのポイントは、使用しているフレームワークとその例外管理の構成要素によって異なります。キーとなる質問は、あなたののエントリポイントはです。ここで、キャッチされていないエスケープ例外を許可すると悪影響がありますか?典型的な例は、(少なくともリサイズとASP.NETでexception event handlersを提供することにより、ひとまとめキャッチすることができる)インタラクティブUIアプリケーションで

  1. イベント処理コードを含みます。
  2. 外部メッセージに応答する統合ポイント(キューからのメッセージの取り出し、ファイルの処理、名前付きパイプでのリッスン、WCFサービスの実装など)。
  3. バックグラウンド処理を行うタイマーイベント。
  4. スレッド開始メソッド。

場合によっては、低レベルの一般的な技術的なエラーをキャッチして、ドメイン特有の例外として再試行することもできます。これは一般に、内部実装の詳細からユーザーを保護するために設計されたライブラリで行われます。エンタープライズアプリケーションでは、より高いレベルのロジックで処理するために、特定のSqlExceptionをキャッチしてアプリケーション固有の例外(例:YourApp.UnknownCustomer)として再スローすることができます。

私の助言は、できるだけ高いレベルで問題を処理しますが、そこにいる例外捕捉者が適切な例外を持っていることを保証してください。ところで、あなたのユーザーを嫌っていない限り、例外とそのスタックトレースを表示しないでください! ;-)