繁体   English   中英

Reflection MethodInfo.Invoke()从方法内部捕获异常

[英]Reflection MethodInfo.Invoke() catch exceptions from inside the method

我调用了MethodInfo.Invoke()来通过反射执行一个函数。 调用包装在try/catch块中,但它仍然不会捕获我正在调用的函数抛出的异常。

我收到以下消息:

用户未处理异常。


为什么MethodInfo.Invoke()阻止在Invoke()之外捕获异常?
我该如何绕过它?

编辑:据我了解你的问题,问题纯粹是一个IDE; 你不喜欢VS将MethodInfo调用引发的异常视为未捕获,当它显然不是时。 您可以在此处阅读有关如何解决此问题的信息: 为什么IDE会将TargetInvocationException视为未捕获? 它似乎是一个错误/设计; 但不管怎样,在答案中列出了体面的解决方法。

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

  1. 您可以使用MethodInfo.Invoke ,捕获TargetInvocationException并检查其InnerException属性。 您将不得不解决该问题中提到的IDE问题。

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

这是一个突出两种方法的例子:

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();
    }
}

你是如何抓住异常的呢? 通常, Invoke()抛出的是System.Reflection.TargetInvocationException的包装异常实例。 您之后的实际异常将在InnerException

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM