没有人解释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类似,因为保留了原始异常的行号,但不是真正的重新抛出,因为它更改了原始异常的类型。