如何正确解包TargetInvocationException?

时间:2013-07-09 18:18:50

标签: c# .net reflection exception-handling

我正在编写一个组件,它在顶层通过反射调用方法。为了使我的组件更容易使用,我想捕获被调用方法抛出的任何异常并解开它们。

因此,我有类似的东西:

try { method.Invoke(obj, args); }
catch (TargetInvocationException ex) {
    throw ex.InnerException;
}

但是,这会吹走内部异常堆栈跟踪。我不能在这里使用throw(因为我正在重新抛出一个不同的异常对象)。我可以在catch块中做些什么来确保原始异常类型,消息和堆栈跟踪都能通过?

1 个答案:

答案 0 :(得分:17)

回答here,从.NET 4.5开始,您可以使用ExceptionDispatchInfo类来解包内部异常。

try
{
    someMethod.Invoke();
}
catch(TargetInvocationException ex)
{
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}