非同期 C# と AggregateExceptions の課題
await
を使用して C# で非同期操作を操作する場合、障害が発生したタスクからの例外の管理には細心の注意が必要です。 await
は通常、AggregateException
内で発生した最初の例外を再スローしますが、残念ながら後続の例外は失われます。この省略により、不完全なエラー報告が発生し、デバッグ作業が妨げられる可能性があります。
解決策: 例外の詳細を保持する
AggregateException
内に含まれるすべての例外の詳細を効果的に保持するために、カスタム拡張メソッドは堅牢なソリューションを提供します。
<code class="language-csharp">public static async Task WithAggregateExceptionHandling(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Preserve original exception context ExceptionDispatchInfo.Capture(source.Exception ?? new Exception("Task was cancelled or encountered an unknown error.")).Throw(); } }</code>
この拡張メソッドは、await
呼び出しを try-catch
ブロック内にカプセル化します。 重要なのは、ExceptionDispatchInfo.Capture
を使用して元の例外 (タスクがキャンセルされた場合はデフォルトの例外) を再スローし、スタック トレースを含む完全な例外コンテキストが確実に維持されるようにすることです。
実装例
このメソッドの統合は簡単です:
<code class="language-csharp">Task[] tasks = new[] { /* ... your tasks ... */ }; await Task.WhenAll(tasks).WithAggregateExceptionHandling(); // Rethrows AggregateException with full context</code>
このアプローチを採用することで、開発者は非同期 C# コードで AggregateExceptions
を効果的に処理できるようになり、貴重なエラー情報の損失を防ぎ、より徹底的なエラー処理とデバッグを容易にすることができます。
以上が非同期 C# コードで AggregateExceptions を処理するときにエラー情報の損失を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。