首页 > 后端开发 > C++ > 在等待带有 AggregateException 的任务时如何保留所有异常详细信息?

在等待带有 AggregateException 的任务时如何保留所有异常详细信息?

Linda Hamilton
发布: 2025-01-12 16:11:43
原创
630 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板