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

时间:2012-01-23 21:50:02

标签: c#

我写了一个自定义异常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");
        }
    }
}

然而,奇怪的事情发生了。即使抛出一个AbortTestException,也会使用catch(Exception)块(而不是catch(AbortTestException)块)。我尝试在try块本身中添加“throw new AbortTestException(”hi“)”部分,并验证是否使用了正确的catch块。

是否有某些原因在通过MethodInfo.invoke()发出时会重新生成异常?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

你检查过嵌套的Exception吗?我的猜测原始异常(AbortTest ...)包含在嵌套的异常中。嵌套的Exception将在您的代码

捕获的属性的InnerException属性中

答案 2 :(得分:0)

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

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