首頁 > 後端開發 > C++ > 使用'await”時如何最好地處理聚合異常?

使用'await”時如何最好地處理聚合異常?

DDD
發布: 2025-01-12 15:56:42
原創
556 人瀏覽過

How Can I Best Handle AggregateExceptions When Using `await`?

非同步程式設計中AggregateException的處理難題

在非同步程式設計的世界中,await關鍵字提供了一種優雅的方式來暫停執行,直到任務完成。但是,當處理出錯的任務時,await會引入一個細微的問題:它會重新拋出AggregateException中的第一個異常,從而可能丟失寶貴的錯誤訊息。

為了解決這個問題,開發人員面臨一個難題。他們可能會求助於一些不優雅的解決方案,或嘗試使用自訂awaiter。但是,在await中乾淨地處理AggregateException的最佳實踐仍然難以捉摸。

問題的答案

與標題中的建議相反,在這種情況下await的預設行為通常是有益的。在大多數情況下,只知道一個異常就足夠了。真正的挑戰在於以允許選擇性異常處理的方式來處理AggregateException

為了實現這一點,以下擴充方法提供了一個簡潔的解決方案:

<code class="language-csharp">public static async Task WithAggregateException(this Task source)
{
  try
  {
    await source.ConfigureAwait(false);
  }
  catch (Exception ex)
  {
    // source.Exception 可能为 null,如果任务被取消。
    if (source.Exception == null)
      throw ex; // 抛出原始异常,例如取消异常

    // EDI 保留原始异常的堆栈跟踪,如果有的话。
    ExceptionDispatchInfo.Capture(source.Exception).Throw();
  }
}</code>
登入後複製

透過將await操作封裝在一個try-catch區塊中,此方法允許開發人員存取AggregateException並使用ExceptionDispatchInfo.Capture重新拋出它。這保留了原始異常的堆疊跟踪,使開發人員能夠適當地處理錯誤。 修改後的程式碼更完整地處理了任務取消的情況。

以上是使用'await”時如何最好地處理聚合異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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