我写了一个自定义异常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()发出时会重新生成异常?
答案 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");
}