2012-01-11 28 views
3

私はcatch節に置く場合:例外のスローまたは再スロー?

... 
catch(Exception e) 
{ 
    throw new Exception("msg", e); 
} 

は私が投げや電子例外を再スローするだろうか?他の場所でtryブロックにそれ を使用したりしながら、例外をスローして

だからスロー句がキャッチに を使用したことを言って例外を再スローされる正しいのですか?

最終的またはThowさんスロー例外およびまたは再スロー例外?

ありがとうございました。

+1

ここでは新しい例外を投げていますが、実際の例外はこれを包み込みます。私は再投げを「投げ」と分類します。 –

+0

Exceptionより一般的ではないものを捕まえるべきでしょう。 –

答えて

4

あなたが投げます例外は初めてです。

throw new Exception(); 

あなたは、キャッチした例外

} catch (Exception e) { 
    // do something 
    throw e; 
} 

を再スローあなたは、その例外が含まれているさまざまな例外をスローした例外をラップします。

} catch (Exception e) { 
    // do something 
    throw new Exception(e); 
} 
4

私は例外をスローすると言います。

これは再スローする例外です:

... 
catch(Exception e) 
{ 
    throw e; 
} 

私は私は1つに、いくつかの例外をラップしたい場合は、新しい例外をスロー、または私は新しい情報を追加したい場合です。もしそうでなければ、私はそれを再スローする方が良いと思う。

0

http://www.codinghorror.com/blog/2004/07/rethrowing-exceptions.html

このリンクを使用すると、例外を再スローする際の意思決定を助ける必要があります。

通常、キャッチは例外自体を処理できるはずですが、できない場合は例外を再スローすることをお勧めします。もう1つ注目すべき点は、キャッチがどこにあるかです(たとえば、コントローラとモデルの場合、コントローラのアクションでキャッチして、ビューで処理できるようにすることです)。

0

最後の質問に答えるには

これを行うと新しい例外がスローされます。たとえば、アプリケーション固有の例外で基礎となる例外を上位層で消費するために包括するのは一般的です。これらは、元の例外の情報を保持するために、ほとんどの場合、連鎖されるべきです。

例外チェーン/スタックトレースからコンテキストのレイヤーが削除されるため、IMOの再スローイングは通常はお勧めできません。 OTOH、あなたが本当に何もできないなら、再投げが最も理にかなっているかもしれません。その場合、私は一般的にメソッドthrowsを示し、ローカルリソースのクリーンアップなどのために必要でない限り、ローカル例外処理を行いません。

0

ビジネス条件を実行するための特定の前提条件が満たされていない場合、たとえば口座残高が0であり、口座引き落としができない場合、NotSufficientAmountExceptionがスローされます。

再スローは異なる目的のためである

、1、呼び出し側が何か間違って起こった、2は、コード・エラーの行はなどを発生した上でより多くの詳細を呼び出し側にスタックトレースを渡すことを知らせるために、

0

あなたの質問は次のとおりです:「私は例外を投げているか再投げていますか?

あなたはどちら投げたり、いくつかの新しいメッセージを持つ新しい例外を投げている 電子例外を再スローされています。 元のe例外(キャッチされた例外)が新しい例外を投げたため、新たにスローされた例外のcauseByに表示されます。

少年ああ。

関連する問題