首頁 >後端開發 >C++ >在 C# 中重新引發異常時如何保留堆疊追蹤?

在 C# 中重新引發異常時如何保留堆疊追蹤?

DDD
DDD原創
2025-01-17 07:06:09224瀏覽

How Can I Preserve Stack Traces When Rethrowing Exceptions in C#?

C#中重新拋出內部異常時保留堆疊追蹤

雖然重新拋出InnerException以將底層異常傳遞給呼叫者是一種常見做法,但這可能會意外地刪除寶貴的堆疊追蹤訊息,從而阻礙調試工作。

在C#中,當透過反射呼叫方法並發生異常時,會拋出TargetInvocationException作為實際異常的包裝器。為了檢索內部異常,開發人員通常會直接重新拋出它。但是,此操作會擦除指向錯誤真正來源的堆疊追蹤資訊。

使用ExceptionDispatchInfo的解決方案

自.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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn