当通过method.invoke()调用方法时,为什么自定义异常更改为System.exception

本文关键字:自定义异常 为什么 exception System 方法 method invoke 调用 | 更新日期: 2023-09-27 18:21:07

我已经编写了一个自定义异常AbortTestException,它非常简单:

class AbortTestException : Exception
{
    public AbortTestException(string message) 
        : base(message) { }
}

然后我有一个函数会抛出它:

class Foo
{
    public void Throws()
    {
        throw new AbortTestException("hi");
    }
}

Throws()通过方法引用被调用:

class Program
{
    static void Main(string[] args)
    {
        Type myType = (typeof(Foo));
        var method = myType.GetMethod("Throws");
        try
        {
            method.Invoke(new Foo(), null);
        }
        catch (AbortTestException ex)
        {
            Console.WriteLine("AbortTestException");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception");
        }
    }
}

然而,奇怪的事情发生了。即使Throws引发AbortTestException,也会使用catch(Exception)块(而不是catch(AbortTestException)块)。我尝试将"throw-new AbortTestException("hi")"部分放入try块本身,并验证是否使用了正确的catch块。

当通过MethodInfo.invoke()发出异常时,是否有什么原因会重新抛出异常?

当通过method.invoke()调用方法时,为什么自定义异常更改为System.exception

http://msdn.microsoft.com/en-us/library/4k9x6bc0.aspx

根据MSDN,如果被调用的方法或构造函数抛出异常,则会抛出TargetInvocationException。

是否检查了嵌套异常?我猜最初的异常(AbortTest…)被包装在一个嵌套的异常中。嵌套的异常将位于代码捕获的异常的InnerException属性中

请记住,捕获Exception将匹配之前没有被更具体的捕获块捕获的任何异常:

    Type myType = (typeof(Foo));
    var method = myType.GetMethod("Throws");
    try
    {
        try
        {
            method.Invoke(new Foo(), null);
        }
        catch (AbortTestException ex)
        {
            Console.WriteLine("AbortTestException");
        }
        catch(TargetInvocationException tie)
        {
            throw tie.InnerException;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception");
        }
    }
    catch(AbortTestException ate)
    {
        Console.WriteLine("AbortTestException after re-throw from TargetInvocationException");
    }