Nadie ha explicado la diferencia entre ExceptionDispatchInfo.Capture( ex ).Throw()
y una simple throw
, así que aquí está.
La forma completa de volver a generar una excepción detectada es utilizarla ExceptionDispatchInfo.Capture( ex ).Throw()
(solo disponible en .Net 4.5).
A continuación están los casos necesarios para probar esto:
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 );
}
}
El caso 1 y el caso 2 le darán un seguimiento de la pila donde el número de línea del código fuente para el CallingMethod
método es el número de línea delthrow new Exception( "TEST" )
línea línea.
Sin embargo, el caso 3 le dará un seguimiento de la pila donde el número de línea del código fuente para el CallingMethod
método es el número de línea de la throw
llamada. Esto significa que si la throw new Exception( "TEST" )
línea está rodeada por otras operaciones, no tiene idea de en qué número de línea se produjo la excepción.
El caso 4 es similar con el caso 2 porque el número de línea de la excepción original se conserva, pero no es un cambio real porque cambia el tipo de la excepción original.