Duplicado de: In C#, how can I rethrow InnerException without losing stack trace?¿Cómo puedo volver a lanzar una excepción interna mientras mantengo el seguimiento de pila generado hasta ahora?
Tengo algunas operaciones que invoco asincrónicamente en una cadena de fondo. A veces, las cosas van mal. Cuando esto sucede, tiendo a obtener una TargetInvocationException, que, aunque es apropiada, es bastante inútil. Lo que realmente necesito es InnerException del TargetInvocationException, así:
try
{
ReturnValue = myFunctionCall.Invoke(Target, Parameters);
}
catch (TargetInvocationException err)
{
throw err.InnerException;
}
De esa manera, las personas que llaman mis se sirven con la excepción de que se produjo VERDADERO. El problema es que la instrucción throw parece restablecer el seguimiento de la pila. Me gustaría básicamente replantear la excepción interna, pero mantener la pila que originalmente tenía. ¿Cómo puedo hacer eso?
ACLARACIÓN: La razón por la que quiero solamente la excepción interna es que esta clase intenta 'abstraer' todo el hecho de que estas funciones (delegados suministrados por la persona que llama) se ejecutan en otros temas y otras cosas. Si hay una excepción, entonces las probabilidades son que no tiene nada que ver con que se ejecute en un hilo de fondo, y al que llama realmente le gustaría el seguimiento de la pila que entra en su delegado y encuentra el problema real, no mi invocación.
¿Por qué es TargetInvocationException inútil? Contiene la 'InnerException', por lo que tiene toda la información. –
Respuesta actualizada, intente lanzar la suya utilizando la InnerException –
. Hay otra forma de hacerlo que no requiere vudú. Eche un vistazo a la respuesta aquí: http://stackoverflow.com/questions/15668334/preserving-exceptions-from-dynamically-invoked-methods –