在C#中重新抛出内部异常时保留堆栈跟踪
通过反射调用方法时,异常会被包装在TargetInvocationException中。为了将底层异常传递给调用者同时保留其堆栈跟踪,重新抛出InnerException是一种常见方法。但是,此方法会无意中擦除原始堆栈跟踪。
针对.NET 4.5及以上版本的解决方案
在.NET 4.5中引入了ExceptionDispatchInfo,为这个问题提供了解决方案。通过捕获异常然后重新抛出它,堆栈跟踪将保持不变:
<code class="language-csharp">using ExceptionDispatchInfo = System.Runtime.ExceptionServices.ExceptionDispatchInfo; try { // 可能引发异常的代码 } catch (Exception ex) { ExceptionDispatchInfo.Capture(ex).Throw(); }</code>
此方法适用于任何类型的异常,而不仅仅是AggregateException。
ExceptionDispatchInfo的优势
ExceptionDispatchInfo具有以下几个优点:
以上是如何在保留原始堆栈跟踪的同时重新抛出 C# 中的内部异常?的详细内容。更多信息请关注PHP中文网其他相关文章!