비동기 작업 및 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!