异常不会从c#中的反射方法调用传播

时间:2011-11-07 19:54:54

标签: c# visual-studio reflection

当通过methodInfo.Invoke调用方法时,如果抛出异常,它似乎不会传播到我的catch块。

object value;
try
{
    value = myMethod.Invoke(null, parameters);//program crashes with uncaught exception
}
catch
{
    throw new Exception("Caught!");//never executed
}

此方法引发的特殊异常是KeyNotFoundException,但这应该无关紧要,因为我正在捕捉一切吗?

我从Visual Studio获得的特定错误消息是

KeyNotFoundException was unhandled by user code

通常消息会说

KeyNotFoundException was unhandled

如果调用不是反射调用。

我可以让方法检查它们是否在那里,如果没有返回null,但是使用异常处理似乎更可取。有没有办法从反射的方法调用中传播异常?

3 个答案:

答案 0 :(得分:3)

它对我有用:

using System;
using System.Reflection;

class Program
{
    static void Main(string[] args)  
    {
        var method = typeof(Program).GetMethod("ThrowException");
        try
        {
            method.Invoke(null, null);
        }
        catch (TargetInvocationException e)
        {
            Console.WriteLine("Caught exception: {0}", e.InnerException);
        }
    }

    public static void ThrowException()
    {
        throw new Exception("Bang!");
    }
}

请注意,您需要捕获TargetInvocationException,这是Method.Invoke直接抛出的异常,包装方法本身抛出的异常。

你能想出一个类似的简短但完整的程序来证明这个问题吗?

答案 1 :(得分:3)

这也可能是Visual Studio调试器的问题。正如对此类似问题here的已接受答案中所述,您可以执行一些解决方法。最简单的是更改Visual Studio调试器以关闭工具中的“仅我的代码” - >选项 - >调试 - >一般。您也可以将它包装在委托中或显式尝试捕获调用异常并检查它的内部异常,这应该是您的KeyNotFoundException。

答案 2 :(得分:1)

如果在使用反射调用的方法期间发生错误,则应该抛出一个TargetInvocationException包装(通过.InnerException)原始文件。但是,有一些方法可能导致更多终端失败,例如围绕winform创建/消息循环的一些方法。

该方法也可能正常工作,但导致其他线程发生了额外的工作, 失败。这会杀死线程,你无法捕获它,因为它不在你的线程上。如果您的代码实际上在工作线程上,则特别有可能。