カスタム Awaiter を使用した AggregateExceptions の非同期処理
AggregateException
を含む失敗したタスクを処理する標準的なアプローチでは、最初の例外のみがスローされ、残りは失われます。デバッグやエラー分析に包括的な例外の詳細が重要な場合、これは重大な問題を引き起こします。
課題:
明示的な AggregateException
ブロックや直接 try-catch
呼び出しなどの面倒な回避策を回避して、非同期操作中に完全な Task.Wait()
を効果的にキャプチャして再スローするにはどうすればよいですか?
解決策: カスタム Awaiter
組み込みの TaskAwaiter
を直接変更するのは複雑です。 より現実的な解決策には、AggregateException
を正しく管理するためのカスタム awaiter を作成することが含まれます。
改良された WithAggregateException
メソッド:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Handle cancellation separately. if (source.IsCanceled) throw new TaskCanceledException(source); // Re-throw the original exception, preserving stack trace. ExceptionDispatchInfo.Capture(ex).Throw(); } }</code>
この拡張メソッドは、Task
クラスを拡張します。 await 操作中に例外をインターセプトし、元の AggregateException
(または別の種類の例外の場合はその内部例外) とその完全なスタック トレースが再スローされるようにします。 これにより、よりクリーンで有益なエラー処理メカニズムが提供されます。
以上が内部例外を失わずに AggregateExceptions を待つにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。