>백엔드 개발 >C++ >AggregateException이 포함된 작업을 기다릴 때 모든 예외 세부 정보를 어떻게 보존할 수 있습니까?

AggregateException이 포함된 작업을 기다릴 때 모든 예외 세부 정보를 어떻게 보존할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-12 16:11:43631검색

How Can I Preserve All Exception Details When Awaiting a Task with AggregateException?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.