Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception has been thrown by the target of an invocation (MethodBase.Invoke Method)

I want to catch the exceptions that are thrown in methods called with invoke method.

public void TestMethod()
{
   try     
   {
       method.Invoke(commandHandler, new[] { newCommand });
   }
   catch(Exception e)
   {     
       ExceptionService.SendException(e);
   }
}

method.Invoke calls the following method:

public void Register(/*parameters*/)
{
     if(test_condition())
          throw new CustomException("Exception Message");
}

The problem is that when I catch the CustomException, in the TestMethod, the e variable on the catch statement has NOT the type CustomException. It has the following message: "Exception has been thrown by the target of an invocation".

I want to catch the exception that has been raised (which is CustomException), and pass it to the ExceptionService mechanism.

What am I doing wrong?

like image 530
Cosmin Ioniță Avatar asked Dec 24 '22 14:12

Cosmin Ioniță


1 Answers

Yes, you're calling the method via reflection. So as per the documentation, a TargetInvocationException will be thrown if the target method throws an exception.

Just use the InnerException property to obtain - and potentially throw - the original exception.

So for example:

try     
{
    method.Invoke(commandHandler, new[] { newCommand });
}
catch (TargetInvocationException e)
{     
    ExceptionService.SendException(e.InnerException);
}
like image 114
Jon Skeet Avatar answered Dec 28 '22 06:12

Jon Skeet