首頁 >後端開發 >C++ >在等待帶有 AggregateException 的任務時如何保留所有異常詳細資訊?

在等待帶有 AggregateException 的任務時如何保留所有異常詳細資訊?

Linda Hamilton
Linda Hamilton原創
2025-01-12 16:11:43633瀏覽

How Can I Preserve All Exception Details When Awaiting a Task with AggregateException?

非同步操作和 AggregateException:保留異常訊息

當等待一個已出錯的任務時,await 通常會重新拋出儲存的例外。但是,如果儲存的異常是 AggregateException,它只會重新拋出第一個例外。

為了克服這個問題並捕捉所有錯誤訊息,請考慮以下最佳實踐:

使用擴充方法

您可以建立一個擴充方法 WithAggregateException,它可以保留原始異常堆疊追蹤(如果存在):

<code class="language-csharp">public static async Task WithAggregateException(this Task source)
{
  try
  {
    await source.ConfigureAwait(false);
  }
  catch
  {
    // 检查取消的任务。
    if (source.Exception == null)
      throw;

    // 保留原始堆栈跟踪。
    ExceptionDispatchInfo.Capture(source.Exception).Throw();
  }
}</code>

透過使用此擴充方法,您可以等待任務並將 AggregateException 作為具有保留詳細資訊的單一實體進行處理。

範例

考慮以下範例:

<code class="language-csharp">// 创建一个具有多个异常的任务。
var task = Task.FromException(new AggregateException(new Exception("异常 1"), new Exception("异常 2")));

// 使用扩展方法等待任务。
try
{
  await task.WithAggregateException();
}
catch (AggregateException ex)
{
  Console.WriteLine("捕获所有异常:");
  foreach (var innerEx in ex.InnerExceptions)
  {
    Console.WriteLine(innerEx.Message);
  }
}</code>

輸出:

<code>捕获所有异常:
异常 1
异常 2</code>

此擴充方法可讓您在等待任務的同時保留所有異常訊息,確保不會意外遺失錯誤詳細資訊。

以上是在等待帶有 AggregateException 的任務時如何保留所有異常詳細資訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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