2016-08-18 22 views
2

throw;throw ex;の間で選択するベストプラクティスは何ですか?全くありますか?この単純なスニペット例 - -forについて:例外を投げる方法

try{ 
    // some code 
} catch (Exception ex) { 
    // some catcher code 
    // throw; ? 
    // or 
    // throw ex; ? 
    // how to decide which one? 
} 

UPDATE: は、私は上記の牽引との違いを知っています。どのようにそれらの1つを使用することを決定するのですか?より良い選択をするためのベストプラクティスはありますか?

+2

'throw'を使用して、元のスタックトレースを保持します。しかし、なぜあなたは一般的な例外をすべてキャッチしますか?私はあなたがそれを扱うことができないようだ、なぜそれをキャッチする? – Maarten

+0

@Maarten時々起こるでしょう。例えば、いくつかの操作の再試行 –

+0

["throw"と "throw ex"の違いはありますか?](http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw -and-throw-ex) – Sinatr

答えて

1

非常にsimpleです。

例外が発生する場所を正確に表示するためにスタックトレースを保持しますか? throwを使用してください。これはcatchをまったく使用しない場合と同じです。

あなただけの気になる現在のメソッドデバッグ情報?その後、throw ex。実証するために

static void Main(string[] args) 
{ 
    try 
    { 
     Test(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
} 

static void Test() 
{ 
    try 
    { 
     // long lambda chain 
     new Action(() => new Action(() => new Action(() => { throw new InvalidOperationException(); })())())(); 
    } 
    catch (Exception ex) 
    { 
     //throw; 
     //throw ex; 
    } 
} 

throwは、スタックトレースを維持します:

System.InvalidOperationException: Operation is not valid due to the current state of the object. 
    at ConsoleApplication.Program.<>c.<Test>b__1_2() in ConsoleApplication\Program.cs:line 22 
    at ConsoleApplication.Program.<>c.<Test>b__1_1() in ConsoleApplication\Program.cs:line 22 
    at ConsoleApplication.Program.<>c.<Test>b__1_0() in ConsoleApplication\Program.cs:line 22 
    at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 26 
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13 

throw exは、スタックトレースをリセットします:ベストプラクティスについては

System.InvalidOperationException: Operation is not valid due to the current state of the object. 
    at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 27 
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13 

- 選択肢があるが通常throwはできるだけ多くの情報を得たいと思う開発者としてthrow exが対応しています - いくつかの情報は隠されていますが、それを隠そうとしている人は誰ですか?

8

throw;を使用して元の例外(元のスタックトレースを含む)を再スローするか、throw new MyException(..., ex);を使用して、独自の例外をスローして追加情報を提供し、内部例外をexに設定する必要があります。

あなたが唯一のクリーンアップを行うには、例外をキャッチした場合だけではなく、try {...} finally {...}を使用し、その後、throw;

を使用する任意の付加的な情報を持っていない場合。

関連する問題