Niemand hat den Unterschied zwischen ExceptionDispatchInfo.Capture( ex ).Throw()
und eine einfache throw
Hier ist sie also.
Die vollständige Art und Weise, eine abgefangene Ausnahme erneut auszulösen, ist die Verwendung von ExceptionDispatchInfo.Capture( ex ).Throw()
(erst ab .Net 4.5 verfügbar).
Nachfolgend sind die Fälle aufgeführt, die für die Prüfung dieser Frage erforderlich sind:
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 );
}
}
In den Fällen 1 und 2 erhalten Sie einen Stack-Trace, in dem die Quellcode-Zeilennummer für die CallingMethod
Methode ist die Zeilennummer der throw new Exception( "TEST" )
Linie.
In Fall 3 erhalten Sie jedoch einen Stack-Trace, in dem die Quellcode-Zeilennummer für die CallingMethod
Methode ist die Zeilennummer der throw
anrufen. Dies bedeutet, dass, wenn der throw new Exception( "TEST" )
Zeile von anderen Operationen umgeben ist, haben Sie keine Ahnung, bei welcher Zeilennummer die Ausnahme tatsächlich ausgelöst wurde.
Fall 4 ist ähnlich wie Fall 2, da die Zeilennummer der ursprünglichen Ausnahme erhalten bleibt, aber es handelt sich nicht um einen echten Rückruf, da der Typ der ursprünglichen Ausnahme geändert wird.