ExceptionDispatchInfo.Capture( ex ).Throw()
没有人解释和 plain之间的区别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 类似,因为保留了原始异常的行号,但不是真正的重新抛出,因为它改变了原始异常的类型。