雖然重新拋出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中文網其他相關文章!