Duplicato di: In C#, how can I rethrow InnerException without losing stack trace?Come posso rilanciare un'eccezione interna mantenendo la traccia dello stack generata finora?
Ho alcune operazioni che richiamo in modo asincrono su un thread in background. A volte le cose vanno male. Quando ciò accade, tendo a ottenere una TargetInvocationException, che, se del caso, è abbastanza inutile. Quello che ho veramente bisogno è InnerException del TargetInvocationException, in questo modo:
try
{
ReturnValue = myFunctionCall.Invoke(Target, Parameters);
}
catch (TargetInvocationException err)
{
throw err.InnerException;
}
In questo modo, i miei interlocutori sono serviti con l'eccezione reale che si è verificato. Il problema è che l'istruzione throw sembra resettare la traccia dello stack. Mi piacerebbe fondamentalmente ripensare all'eccezione interna, ma mantenere traccia dello stack originariamente. Come lo faccio?
PRECISAZIONE: Il motivo che voglio solo l'eccezione interna è che questa classe cerca di 'astrarre' tutto fatto che queste funzioni (delegati forniti dal chiamante) sono eseguiti su altri thread e quant'altro. Se c'è un'eccezione, allora le probabilità sono che non ha nulla a che fare con l'esecuzione su un thread in background, e il chiamante gradirebbe davvero la traccia dello stack che va al loro delegato e trova il vero problema, non la mia chiamata da invocare.
Perché TargetInvocationException inutile? Contiene 'InnerException', quindi ha tutte le informazioni. –
Risposta aggiornata, prova a lanciare la tua usando InnerException –
C'è un altro modo per farlo che non richiede alcun voodoo. Dai un'occhiata alla risposta qui: http://stackoverflow.com/questions/15668334/preserving-exceptions-from-dynamically-invoked-methods –