Niemand hat den Unterschied zwischen ExceptionDispatchInfo.Capture( ex ).Throw()
und einer Ebene erklärtthrow
, also hier ist es.
Der vollständige Weg, um eine abgefangene Ausnahme erneut auszulösen, ist die Verwendung ExceptionDispatchInfo.Capture( ex ).Throw()
(nur ab .NET 4.5 verfügbar).
Nachfolgend sind die Fälle aufgeführt, die zum Testen 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 );
}
}
Fall 1 und Fall 2 geben Ihnen eine Stapelverfolgung, wobei die Quellcode-Zeilennummer für die CallingMethod
Methode die Zeilennummer der istthrow new Exception( "TEST" )
Zeile ist.
In Fall 3 erhalten Sie jedoch eine Stapelverfolgung, bei der die Quellcode-Zeilennummer für die CallingMethod
Methode die Zeilennummer des throw
Aufrufs ist. Dies bedeutet, dass throw new Exception( "TEST" )
Sie keine Ahnung haben, bei welcher Zeilennummer die Ausnahme tatsächlich ausgelöst wurde , wenn die Zeile von anderen Operationen umgeben ist.
Fall 4 ist ähnlich wie Fall 2, da die Zeilennummer der ursprünglichen Ausnahme beibehalten wird, jedoch kein echter Neuauswurf ist, da der Typ der ursprünglichen Ausnahme geändert wird.