首頁 > 後端開發 > C++ > 如何在 C# 中正確地重新拋出異常並保留堆疊追蹤?

如何在 C# 中正確地重新拋出異常並保留堆疊追蹤?

Patricia Arquette
發布: 2025-01-23 19:01:08
原創
470 人瀏覽過

How to Properly Rethrow Exceptions in C# and Preserve the Stack Trace?

C#中正確的異常重拋方法

在C#中處理異常時,正確的重拋語法至關重要,它能確保堆疊追蹤的準確性。雖然有些重拋技術看起來相似,但細微的差別會影響調試過程。

方法一:

<code class="language-csharp">try
{
    // ...代码块...
}
catch (Exception ex)
{
    // ...处理代码...
    throw;
}</code>
登入後複製

此方法簡單地重拋捕獲的異常,無需任何修改。通常情況下,它優於方法二,因為它保留了原始堆疊跟踪,允許開發人員準確地追蹤異常到其源頭。

方法二:

<code class="language-csharp">try
{
    // ...代码块...
}
catch (Exception ex)
{
    // ...处理代码...
    throw ex;
}</code>
登入後複製

雖然此方法也重拋異常,但它可能會改變堆疊追蹤。透過明確地拋出捕獲的異常,它創建了一個新的堆疊幀,掩蓋了異常的原始來源,使得更難以找出根本原因。

使用ExceptionDispatchInfo從其他來源重拋異常:

如果需要從不同的上下文(例如聚合異常或單獨的執行緒)重拋異常,則應使用ExceptionDispatchInfo類別。此類捕獲原始異常的必要信息,並允許在新的上下文中重拋它,同時保留其原始堆疊追蹤。

範例:

<code class="language-csharp">try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // 告知编译器代码流不会离开此代码块
}</code>
登入後複製

透過使用ExceptionDispatchInfo類,保留了原始異常的上下文和堆疊跟踪,使開發人員能夠準確地追蹤錯誤到其源頭。

以上是如何在 C# 中正確地重新拋出異常並保留堆疊追蹤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板