虽然重新抛出InnerException以将底层异常传递给调用者是一种常见做法,但这可能会意外地删除宝贵的堆栈跟踪信息,从而阻碍调试工作。
在C#中,当通过反射调用方法并发生异常时,会抛出TargetInvocationException作为实际异常的包装器。为了检索内部异常,开发人员通常会直接重新抛出它。但是,此操作会擦除指向错误真正来源的堆栈跟踪信息。
自.NET 4.5以来,ExceptionDispatchInfo类为这个问题提供了解决方案。它允许捕获异常并在保留其堆栈跟踪的同时重新抛出它。以下是使用方法:
<code class="language-csharp">using ExceptionDispatchInfo = System.Runtime.ExceptionServices.ExceptionDispatchInfo; try { // 执行可能抛出异常的方法。 task.Wait(); } catch (AggregateException ex) { // 捕获内部异常并使用原始堆栈跟踪重新抛出它。 ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); }</code>
这种方法在使用await C#语言特性后从AggregateException实例中解包内部异常时特别有用。它确保在异步编程过程中不会丢失堆栈跟踪信息。
以上是在 C# 中重新引发异常时如何保留堆栈跟踪?的详细内容。更多信息请关注PHP中文网其他相关文章!