Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to correctly unwrap a TargetInvocationException? [duplicate]

I am writing a component which, at the top level, invokes a method via reflection. To make my component easier to use, I'd like to catch any exceptions thrown by the invoked method and unwrap them.

Thus, I have something like:

try { method.Invoke(obj, args); }
catch (TargetInvocationException ex) {
    throw ex.InnerException;
}

However, this blows away the inner exception stack trace. I can't use just throw here (because I'm rethrowing a different exception object). What can I do in my catch block to make sure that the original exception type, message, and stack trace all get through?

like image 630
ChaseMedallion Avatar asked Jul 09 '13 18:07

ChaseMedallion


1 Answers

As answered here, starting with .NET 4.5 you can use the ExceptionDispatchInfo class to unwrap the inner exception.

try
{
    someMethod.Invoke();
}
catch(TargetInvocationException ex)
{
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
like image 116
Dusty Avatar answered Nov 15 '22 18:11

Dusty