首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >反射MethodInfo.Invoke()从方法内部捕获异常

反射MethodInfo.Invoke()从方法内部捕获异常
EN

Stack Overflow用户
提问于 2010-11-07 17:52:21
回答 2查看 33.8K关注 0票数 32

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

我收到以下消息:

用户未处理

异常。

为什么MethodInfo.Invoke()要防止异常在Invoke()之外被捕获

我如何绕过它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-07 19:10:10

编辑:我理解你的问题,这个问题纯粹是一个集成开发环境的问题;你不喜欢VS把调用MethodInfo抛出的异常当作未捕获的异常,而它显然不是。你可以在这里阅读关于如何解决这个问题的文章:Why is TargetInvocationException treated as uncaught by the IDE?它看起来像是一个bug /被设计出来;但无论如何,答案中都列出了一些不错的解决方法。

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

  1. 您可以使用MethodInfo.Invoke,捕获TargetInvocationException并检查其InnerException属性。你必须解决这个答案中提到的集成开发环境的问题。
  2. 你可以在Delegate之外创建一个合适的MethodInfo并调用它。使用这种技术,抛出的异常将不会被包装。此外,这种方法似乎与调试器配合得很好;我没有得到任何“未捕获的异常”弹出窗口。

下面的示例重点介绍了这两种方法:

代码语言:javascript
复制
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();
    }
}
票数 31
EN

Stack Overflow用户

发布于 2010-11-07 18:49:39

您是如何尝试捕获异常的?通常,从调用Invoke()抛出的是System.Reflection.TargetInvocationException的包装异常实例。您要寻找的实际异常将在InnerException中。

代码语言:javascript
复制
try
{
    method.Invoke(target, params);
}
catch (TargetInvocationException ex)
{
    ex = ex.InnerException; // ex now stores the original exception
}
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4117228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档