ExceptionDispatchInfo.Capture( ex ).Throw()
とプレーンの違いを説明した人はいませんthrow
。
キャッチされた例外を再スローする完全な方法は、使用することですExceptionDispatchInfo.Capture( ex ).Throw()
(.Net 4.5からのみ利用可能)。
以下に、これをテストするために必要なケースがあります。
1。
void CallingMethod()
{
//try
{
throw new Exception( "TEST" );
}
//catch
{
// throw;
}
}
2。
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
ExceptionDispatchInfo.Capture( ex ).Throw();
throw; // So the compiler doesn't complain about methods which don't either return or throw.
}
}
3。
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch
{
throw;
}
}
4。
void CallingMethod()
{
try
{
throw new Exception( "TEST" );
}
catch( Exception ex )
{
throw new Exception( "RETHROW", ex );
}
}
ケース1とケース2は、CallingMethod
メソッドのソースコード行番号が行の行番号であるスタックトレースを提供しますthrow new Exception( "TEST" )
。
ただし、ケース3では、CallingMethod
メソッドのソースコード行番号がthrow
呼び出しの行番号であるスタックトレースが得られます。これは、throw new Exception( "TEST" )
行が他の操作に囲まれている場合、例外が実際にスローされた行番号がわからないことを意味します。
ケース4は、元の例外の行番号が保持されるという点でケース2と似ていますが、元の例外のタイプを変更するため、実際の再スローではありません。