非常に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
が対応しています - いくつかの情報は隠されていますが、それを隠そうとしている人は誰ですか?
'throw'を使用して、元のスタックトレースを保持します。しかし、なぜあなたは一般的な例外をすべてキャッチしますか?私はあなたがそれを扱うことができないようだ、なぜそれをキャッチする? – Maarten
@Maarten時々起こるでしょう。例えば、いくつかの操作の再試行 –
["throw"と "throw ex"の違いはありますか?](http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw -and-throw-ex) – Sinatr