【问题标题】:How to correctly unwrap a TargetInvocationException? [duplicate]如何正确解开 TargetInvocationException? [复制]
【发布时间】:2013-07-07 11:36:29
【问题描述】:

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

因此,我有类似的东西:

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

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

【问题讨论】:

  • 无需在问题标题中放置标签。正确标记就足够了。
  • 为什么你认为它更容易混淆堆栈跟踪?

标签: c# .net reflection exception-handling


【解决方案1】:

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

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

【讨论】:

  • 应该被标记为答案。有同样的问题,这让我发疯了。
猜你喜欢
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2015-04-06
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多