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