AggregateException을 사용하여 오류가 발생한 작업을 기다릴 때 예외 세부 정보 보존
비동기 프로그래밍에는 대기 중인 작업이 포함되는 경우가 많습니다. 그러나 작업이 실패하고 AggregateException
이 포함된 경우 표준 await
연산자는 첫 번째 예외만 다시 발생시키며 잠재적으로 중요한 진단 정보를 잃을 수 있습니다. 이 문서에서는 AggregateException
.
AggregateException
의 편리함을 그대로 활용하면서 원본 await
을 보존하는 것이 과제입니다. try-catch
블록으로 충분해 보일 수도 있지만 더 우아하고 유익한 솔루션이 더 좋습니다. 사용자 정의 waiter를 생성하는 것은 가능하지만 불필요한 복잡성을 추가합니다.
문제를 보여주는 다음 예를 고려해보세요.
<code class="language-csharp">static async Task Run() { Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") }; await Task.WhenAll(tasks); } static Task CreateTask(string message) { return Task.Factory.StartNew(() => { throw new Exception(message); }); }</code>
Run
에서는 기본 작업에서 두 가지 예외가 발생했음에도 불구하고 단 하나의 예외만 다시 발생합니다.
이 솔루션은 확장 방법을 활용합니다.
<code class="language-csharp">public static async Task HandleAggregateExceptions(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Check for null Exception in case of cancellation if (source.Exception == null) throw; // ExceptionDispatchInfo preserves the original exception's stack trace. ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
이 HandleAggregateExceptions
확장 방법을 사용하면 AggregateException
내의 모든 예외가 올바르게 다시 발생되어 원래 스택 추적이 유지됩니다. 이는 철저한 오류 처리를 용이하게 하고 디버깅을 단순화합니다. 이 방법을 사용하면 await tasks.HandleAggregateExceptions();
을 호출하면 완전한 예외 세부정보가 제공됩니다.
위 내용은 예외 세부 정보를 잃지 않고 작업을 정확하게 기다리고 AggregateException을 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!