2011-10-28 28 views
1

私はここでいくつかの質問をし、例外処理についていくつかの記事を読んだが、いつ例外を処理してはいけないのか、本当にいつ把握しているとは思わない。私が読んだ記事では、「あなたが回復できる例外を処理するだけです」ということは、それが意味することは何ですか?例外を処理できない場合、私は何をしますか?それはスタックの上に伝播させますか?私がそれを処理しない場合、どのように私はそれを記録し、ユーザーフレンドリーなエラーメッセージを表示することができます。ほとんどの人はWebアプリケーションやWebサービスで何をしていますか?一例として、.netでの例外処理。

は、私は、SQL

私は下段に例外を処理するにはどうすればよい
try{ 
    //do something with db 
}catch(SqlException ex){ 
//what should i do here 
//should i call code again to retry getting data from db 
}catch(Exception ex){ 
//should i even catch exception of type exception 
} 

からデータを引き出し下段データ層を持っていると言いますか?例外をバブルアップさせるべきでしょうか?もしそうなら、私はsqlexception型の例外をキャッチしたいと思うなら、ライブラリsqlexceptionへの参照が必要ですが、確かにデータアクセスとは関係のない層でそのライブラリを参照する必要はありません。それは早朝にまだここにいるのですが、私はので、ここで、この同じ質問に苦しんできたので、

+0

これらの他のトピックが役立つかもしれない:http://stackoverflow.com/questions/2765086/exception-handling-policy-in-libraries –

+0

http://stackoverflow.com/questions/5772237/exception-handling- in-layered-architecture –

答えて

1

例外管理は大きなテーマですので、ここでは表面に触れます。それを読んで、IVE記事から

はそれが何を意味するん「だけあなたがから回復することができます例外を処理する」述べています。

あなたが特定の例外から回復する方法がわからない場合は、それをキャッチ内の任意のポイントは、通常はありません。それがWebアプリケーションまたはサービスの場合、Webサーバー自体がログと回復を処理します。

場合によっては、トランザクションを取り消したり取り消したりするなど、一般的な復旧ができるように例外をキャッチする必要があります。その場合、受け入れ可能な方法は、例外をキャッチし、汎用リカバリを行い、再度例外をスローすることです。

もし私が何をすれば例外を処理できないのですか?それはスタックをバックアップpropateさせますか?

はい。

私はそれを記録し、ユーザーフレンドリーエラーメッセージを提示することができますどのようにそれを処理いけない場合。ほとんどの人はWebアプリケーションやWebサービスで何をしていますか?

Webサーバーは例外を記録します。 Webアプリケーションにユーザーフレンドリーなエラーメッセージを表示したい場合は、スタックの最上位レベルをキャッチ/ログして、エラーメッセージにリダイレクトすることができます。もう一度、私はSystem.Exceptionをキャッチしないでください - あなたのアプリがスローする例外のリストを作成し、各タイプに合わせたメッセージを表示する前にこれらの型だけをキャッチします。例外タイプのリストが増加するにつれて、コードを変更して新しい例外タイプをそれぞれ禁止するか、その例外タイプに新しいキャッチを追加します。

Webサービスでは、カスタム例外を作成し、それをWebサービスが提供する汎用例外へのノードとして追加できます。

あなたのコード例では、例外を予期していない限り、try ... catchを使用しません。

下位層で例外を処理するにはどうすればよいですか。私は例外をバブルアップさせなければならない。

はい。

+0

それはありがとうございます。非常にストレートです。もし私がウェブアプリケーションの最高レベルでキャッチするならば。どんなタイプの例外が私を捕まえるでしょうか。どこでも読んでいる状態では例外の例外をキャッチしないでください –

+0

@リチャード:私はあなたのコメントに答えるためにテキストを変更しました。 – RoadWarrior

+0

いいですね。私はsqlexceptionをキャッチしたいと思うし、UIでそれをキャッチしたい場合は、例外の型を含む名前空間への参照を追加する必要があります。それは右のようだ –

1

さて、これはあまりにも簡単になります私が理解です:

「だけあなたが回復することができます例外を処理「

ここで理解していただきたいのは、コード内のレベルで例外が発生することです。あなたの低レベルのコードの場合、あなたは例外を処理し、おそらくプロセスを再試行するためにあなたの 'プロセス'を変更することができる層に例外バブルをバックアップさせます。 (私は通常、スローされたところでエラーを記録します)

+0

Nitaxの答えを拡張するために、たとえば、システムのメモリ不足時にスローされるOutOfMemoryExceptionを処理しないでください。クラッシュせずに、ユーザーの作業を保存してアプリケーションを正常に終了します。 –

+0

最後のビットを除き、一般的には良いアドバイスです。ログに記録する場合は、可能な限り最高レベル(UIなど)で実行する必要があります。そうしないと、コード全体にエラーログが記録されます。それらをすべてバブルアップさせるだけなら、未処理の例外を記録するトップレベルの一般的なエラーハンドラを持つことができます。 –

+0

@DylanSmithは実際には良い点です。私は私のコードのさまざまな領域のために定義された異なるトレースを持っているので、私はちょうどこのメソッドを使用してコードを書いています。このようにすれば、ログは適切なトレースに書き込まれます。 – Nitax

2

いくつかの簡単なグラウンドルール:

  • 例外の処理は、プログラムの状態が正確コードが例外を発生させたこと始まった前にそれがあったものと同じであることが必要です。変数を元の状態に戻す多くのキャッチブロックと最終的にブロックが必要になります。

  • 例外をキャッチすると、プログラムを意味のある方法で実行し続けることができます。例えば、データベースサーバがオフラインのときに便利なことはありません。プログラムを停止することもできます。

  • 人間が是正措置を講じる必要がある場合(ほとんどの場合、ほとんどの場合)、問題を解決するのに十分な情報があることを確認してください。例外をUIレイヤーにバブルアップさせます。例外を解釈しないでください(「データベースを更新できませんでした」など)、正確な例外メッセージとスタックトレースを表示しないでください。

  • AppDomain.CurrentDomain.UnhandledExceptionのハンドラーを実装し、e.ExceptionObjectの値を記録または表示します。未処理の例外を診断するのに役立ちます。どこにでもキャッチするのを避けるのに役立ちます。

  • 良い診断を伴う未処理の例外は、プログラムを不安定にし、悪いデータを生成したり、他の無関係な例外がスローされるような、捕捉された例外よりも優れています。

+0

必ずスタックトレースを表示しないでください。そのセキュリティ上のリスクはない!!!! –

+0

もちろん、あなたはどういうことを言っていますか? –