非同期プログラミングでの 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 サイトの他の関連記事を参照してください。