Nikt nie wyjaśnił różnicy między ExceptionDispatchInfo.Capture( ex ).Throw()
zwykłym throw
, więc oto jest.
Całkowitym sposobem na ponowne wyłapanie przechwyconego wyjątku jest użycie ExceptionDispatchInfo.Capture( ex ).Throw()
(dostępne tylko w .Net 4.5).
Poniżej znajdują się przypadki niezbędne do przetestowania tego:
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 );
}
}
Przypadek 1 i przypadek 2 dają ślad stosu, w którym numerem kodu źródłowego dla CallingMethod
metody jest numer throw new Exception( "TEST" )
wiersza.
Jednak przypadek 3 da ci ślad stosu, w którym numerem linii kodu źródłowego dla CallingMethod
metody jest numer linii throw
wywołania. Oznacza to, że jeśli throw new Exception( "TEST" )
linia jest otoczona innymi operacjami, nie masz pojęcia, pod którym numerem linii został zgłoszony wyjątek.
Przypadek 4 jest podobny do przypadku 2, ponieważ zachowany jest numer wiersza oryginalnego wyjątku, ale nie jest to rethrow, ponieważ zmienia typ oryginalnego wyjątku.