ホームページ >バックエンド開発 >C++ >「await」を使用するときに AggregateExceptions を最適に処理するにはどうすればよいですか?

「await」を使用するときに AggregateExceptions を最適に処理するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-12 15:56:42562ブラウズ

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」を使用するときに AggregateExceptions を最適に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。