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