有一个命名域异常DomainException。
public class DomainException : Exception { }
有一个类Foo有Throw转发方法DomainException。
public class Foo
{
public void Throw()
{
throw new DomainException();
}
}
有一个类通过反射调用实例上的Foo方法。Throw
public static class FooManager
{
public static void InvokeThrow(object foo)
{
var methodInfo = typeof(Foo).GetMethod("Throw");
methodInfo.Invoke(foo, null);
}
}
有一段代码调用InvokeThrow并尝试捕获和处理DomainException。
try
{
FooManager.InvokeThrow(new Foo());
}
catch(DomainException ex)
{
//Do something cool.
}
这段代码不会做你想做的,因为它将Invoke内部异常包装在TargetInvocactionException. 所需的DomainException将在InnerException真正转发的异常中。
问题:如何准确捕捉和处理DomainException?
选项:
1 换行呼入Invoke和try-catch转发InnerException。
public static void InvokeThrow(object foo)
{
try
{
var methodInfo = typeof(Foo).GetMethod("Throw");
methodInfo.Invoke(foo, null);
}
catch(TargetInvocationException ex)
{
throw ex.InnerException;
}
}
该变体很糟糕,原因很简单,我们得到一个以InvokeThrow.
我觉得我在这里遗漏了一些非常简单的东西。
是否有一些聪明和/或优雅的方法来捕获此异常/不通过Invoke/在抛出时获取正常堆栈调用方法InnerException?
在 .NET 4.5 中,有一个类
ExceptionDispatchInfo允许您在保留调用堆栈的同时重新抛出其他人的异常:ExceptionDispatchInfo被添加以支持async/await- 因此它们从生成的任务中抛出包裹在AggregateException异常中。