当通过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()发出异常时,是否有什么原因会重新抛出异常?
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");
}