非同期操作と 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 中国語 Web サイトの他の関連記事を参照してください。