从该方法内部反射MethodInfo.Invoke()捕捉异常从该方法内部反射MethodInfo.

2019-05-12 04:13发布

我有一个呼叫MethodInfo.Invoke()通过反射来执行功能。 该呼叫被包裹在一个try/catch块,但它仍然不会赶上由我调用该函数抛出的异常。

我收到以下消息:

例外的是由用户未处理。


为什么MethodInfo.Invoke()防止异常被抓住了外部Invoke()
如何绕过它?

Answer 1:

编辑:据我了解您的问题,这个问题是纯粹的IDE之一; 你不喜欢VS治疗用的调用抛出的异常MethodInfo为未捕获的,当它显然不是。 您可以了解如何在这里解决这个问题: 为什么TargetInvocationException由IDE视为未捕获的? 这似乎是设计中的错误/; 但这种或那种方式,体面的解决办法中列出了这个问题的答案。

在我看来,你有两个选择:

  1. 您可以使用MethodInfo.Invoke ,赶上TargetInvocationException并检查其InnerException属性。 你将不得不在该答复中提到要解决IDE的问题。

  2. 您可以创建一个适当的Delegate出的MethodInfo ,并调用该网址。 利用这种技术,抛出的异常不会被包装。 此外,这种做法似乎与调试发挥很好; 我没有得到任何“未捕获的异常”弹出窗口。

下面是突出了这两种方法的例子:

class Program
{
    static void Main()
    {
        DelegateApproach();
        MethodInfoApproach();
    }

    static void DelegateApproach()
    {
        try
        {
            Action action = (Action)Delegate.CreateDelegate
                                   (typeof(Action), GetMethodInfo());
            action();
        }
        catch (NotImplementedException nie)
        {

        }
     }

    static void MethodInfoApproach()
    {
        try
        {
            GetMethodInfo().Invoke(null, new object[0]);
        }
        catch (TargetInvocationException tie)
        {
            if (tie.InnerException is NotImplementedException)
            {


            }
        }
    }

    static MethodInfo GetMethodInfo()
    {
        return typeof(Program)
                .GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Static);
    }    

    static void TestMethod()
    {
        throw new NotImplementedException();
    }
}


Answer 2:

你是如何试图捕获异常? 通常,什么是从呼叫抛给Invoke()是一个包装异常实例System.Reflection.TargetInvocationException 。 你后实际的异常将在InnerException

try
{
    method.Invoke(target, params);
}
catch (TargetInvocationException ex)
{
    ex = ex.InnerException; // ex now stores the original exception
}


文章来源: Reflection MethodInfo.Invoke() catch exceptions from inside the method