2012-02-09 16 views
0

例外を発生させるコードと同じ方法で処理するべきか、呼び出し元と同じ方法で扱うべきかの例外を取り扱う経験則がありますか?try/catchを新しくスローする

これに関連して、「スロー・ニュー」やキャッチ・ブロックをいつ使うべきかを決めるための経験則/一般的な慣習は何ですか?

おかげ

+0

可能重複(http://stackoverflow.com/questions/409563/best-practices-for-exception-management -in-java-or-c-sharp) – slugster

答えて

3

キャッチとは、例外を処理できることを意味します。

条件を処理して有用なことができるときは、例外をキャッチする必要があります。それ以外の場合は、コールスタックにバブルアップさせる必要があります。おそらくあなたの上の誰かがそれを処理できます。一部のアプリでは、最も外側のレイヤーで処理するための処理されていない例外ハンドラーがありますが、それを処理する便利な方法がわからない限り、一般的には手放します。

throw newとは、あなたの上の誰かが捕まえたいと思うエラー条件を作成していることを意味します。呼び出し側はエラーを処理/捕捉したいので、新しい "Exception"や "ApplicationException"を投げないようにしてください。例外から継承する特定の例外タイプを投げて、ユーザが処理しているものを知っているようにしてください。

例外ではありません。例外的なエラーの場合を除き、投げないでください。たとえば、何かが存在するかどうかをチェックするコードでは、スローしてキャッチしてはいけません。頻繁に呼び出されると、デバッガがブレークし、高価になります。私たちのチームでは、エラーケースに遭遇しなければ常にクリーンに実行するコードを探します。ここで

は、関連記事です:[JavaやC#での例外管理のベストプラクティス]の Trying to understand exceptions in C#

+0

呼び出されたのと同じメソッドで例外をキャッチする場合の例は何ですか? (プログラムの安定性にとって重要な)ビジネスルールが違反されたときに使用されるべきであるような新しいサウンドを投げる。 – dotnetdev

+0

それは正しいです。最も簡単な例は、引数の検証です(新しいArgumentExceptionをスローします)。他の例として、ルール違反が考えられます。最後は意見を持ち、変化します。たとえば、フィールドに「例外」がないとエンティティを保存していますか?一部のユーザー(私を含む)は、ユーザーが日常的にそれを実行し、例外的ではないと主張する可能性があります。あるいは、ビジネスルール違反を処理するために人々にコールバックを委譲することもできます。 – bryanmac

2

取り扱いは例外を扱うことができる最低のレベルで行われるべきです。例えば。低レベルの算術関数が0除算例外を与える場合は、おそらく続けることができます。ファイルI/Oエラーが発生した場合、おそらくアプリケーションの流れで非常に高いレベルで処理する必要があります。

例外が発生する場所で、例外が発生する場所で、新しい例外を使用する必要があります。

例外を処理できる場所にキャッチブロックを追加する必要があります。上で書いたように、キャッチブロックはキャッチする場所によって異なりますが、できるだけ早く処理できます。

+0

この文のキーは「例外を処理できる」ことです。共通ライブラリの深いところでは、それを処理する方法がわからない可能性があります。呼び出し元だけがその状態を処理する方法に関するコンテキストを持っています。 – bryanmac

+0

下位レベル/共通ライブラリは、しばしばエラーをバブルにして、消費者がどのように処理するかを決定させるべきである。おそらく彼らは待って再試行したいと思っています... – bryanmac

+0

メソッドがスローした例外自体を処理できる場合、おそらく例外ではなく通常の実行パス(ループを終了するなど)です。例外が本当に例外か、それがアプリケーションの実行中に発生するかどうかは、常に自分自身に尋ねるべきです。 –

関連する問題