Personne n'a expliqué la différence entre ExceptionDispatchInfo.Capture( ex ).Throw()
et une plaine throw
, alors la voici.
La manière complète de renvoyer une exception interceptée consiste à utiliser ExceptionDispatchInfo.Capture( ex ).Throw()
(uniquement disponible à partir de .Net 4.5).
Vous trouverez ci-dessous les cas nécessaires pour tester cela:
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 );
}
}
Le cas 1 et le cas 2 vous donneront une trace de pile où le numéro de ligne de code source pour la CallingMethod
méthode est le numéro de throw new Exception( "TEST" )
ligne de la ligne.
Cependant, le cas 3 vous donnera une trace de pile où le numéro de ligne de code source pour la CallingMethod
méthode est le numéro de ligne de l' throw
appel. Cela signifie que si la throw new Exception( "TEST" )
ligne est entourée d'autres opérations, vous ne savez pas à quel numéro de ligne l'exception a été levée.
Le cas 4 est similaire au cas 2 car le numéro de ligne de l'exception d'origine est conservé, mais il ne s'agit pas d'un véritable renversement car il modifie le type de l'exception d'origine.