10

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

因此,我有类似的东西:

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

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

4

1 回答 1

29

如此处所回答从 .NET 4.5 开始,您可以使用ExceptionDispatchInfo该类来解开内部异常。

try
{
    someMethod.Invoke();
}
catch(TargetInvocationException ex)
{
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
于 2014-10-10T15:29:47.113 回答