C# で例外を再スローする適切な方法は何ですか? [重複] 質問する

C# で例外を再スローする適切な方法は何ですか? [重複] 質問する

こうする方が良いでしょうか:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw;
}

あるいはこれ:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw ex;
}

それらは同じことをするのでしょうか? どちらかが他方より優れているのでしょうか?

ベストアンサー1

例外を再スローするには、常に次の構文を使用する必要があります。そうしないと、スタック トレースが破壊されます。

throw;

の結果としてのトレースを出力するとthrow ex、例外の実際のソースではなく、そのステートメントで終了していることがわかります。

基本的に、 を使用することは犯罪行為とみなされるはずですthrow ex


他の場所(AggregateException、TargetInvocationException)または別のスレッドから発生した例外を再スローする必要がある場合、それを直接再スローしないでください。代わりに、例外ディスパッチ情報必要な情報をすべて保存します。

try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // just to inform the compiler that the flow never leaves the block
}

おすすめ記事