Nessuno ha spiegato la differenza tra ExceptionDispatchInfo.Capture( ex ).Throw()
e una pianura throw
, quindi eccola qui.
Il modo completo per ricodificare un'eccezione rilevata è utilizzare ExceptionDispatchInfo.Capture( ex ).Throw()
(disponibile solo da .Net 4.5).
Di seguito sono riportati i casi necessari per testare questo:
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 );
}
}
Il caso 1 e il caso 2 forniscono una traccia dello stack in cui il numero di riga del codice sorgente per il CallingMethod
metodo è il numero di riga delthrow new Exception( "TEST" )
riga riga.
Tuttavia, il caso 3 fornisce una traccia dello stack in cui il numero di riga del codice sorgente per il CallingMethod
metodo è il numero di riga della throw
chiamata. Ciò significa che se la throw new Exception( "TEST" )
linea è circondata da altre operazioni, non si ha idea di quale numero di riga sia stata effettivamente generata l'eccezione.
Il caso 4 è simile al caso 2 perché viene conservato il numero di riga dell'eccezione originale, ma non è un vero e proprio rilancio perché modifica il tipo di eccezione originale.