> 백엔드 개발 > C++ > 예외 세부 정보를 잃지 않고 작업을 정확하게 기다리고 AggregateException을 처리하려면 어떻게 해야 합니까?

예외 세부 정보를 잃지 않고 작업을 정확하게 기다리고 AggregateException을 처리하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2025-01-12 15:55:43
원래의
957명이 탐색했습니다.

How Can I Accurately Await Tasks and Handle AggregateExceptions Without Losing Exception Details?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿