我正在编写一个组件,该组件在顶层通过反射调用一个方法。为了使我的组件更易于使用,我想捕获被调用的方法抛出的任何异常并将其打开。
因此,我有这样的东西:
try { method.Invoke(obj, args); }
catch (TargetInvocationException ex) {
throw ex.InnerException;
}
但是,这会破坏内部异常堆栈跟踪。我不能在这里只使用throw
(因为我正在重新考虑一个不同的异常对象)。我可以在catch块中做些什么来确保原始异常类型、消息和堆栈跟踪都通过?
如这里所回答的,从.NET 4.5开始,您可以使用ExceptionDispatchInfo
类来打开内部异常。
try
{
someMethod.Invoke();
}
catch(TargetInvocationException ex)
{
ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}