Никто не объяснил разницу между 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, поскольку номер строки исходного исключения сохраняется, но не является реальным перебрасыванием, поскольку он меняет тип исходного исключения.