首页 > 后端开发 > C++ > 在异步 C# 代码中处理 AggregateException 时,如何防止丢失错误信息?

在异步 C# 代码中处理 AggregateException 时,如何防止丢失错误信息?

Barbara Streisand
发布: 2025-01-12 15:51:43
原创
294 人浏览过

How Can I Prevent Losing Error Information When Handling AggregateExceptions in Asynchronous C# Code?

异步 C# 和 AggregateException 的挑战

使用 await 在 C# 中处理异步操作时,需要仔细注意管理故障任务的异常。 虽然 await 通常会重新抛出 AggregateException 中遇到的第一个异常,但遗憾的是后续异常会丢失。这种遗漏可能会导致错误报告不完整并阻碍调试工作。

解决方案:保留异常详细信息

为了有效保留 AggregateException 中包含的所有异常详细信息,自定义扩展方法提供了一个强大的解决方案:

<code class="language-csharp">public static async Task WithAggregateExceptionHandling(this Task source)
{
    try
    {
        await source.ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        // Preserve original exception context
        ExceptionDispatchInfo.Capture(source.Exception ?? new Exception("Task was cancelled or encountered an unknown error.")).Throw();
    }
}</code>
登录后复制

此扩展方法将 await 调用封装在 try-catch 块中。 至关重要的是,它使用 ExceptionDispatchInfo.Capture 重新抛出原始异常(如果任务被取消,则抛出默认异常),确保维护完整的异常上下文(包括堆栈跟踪)。

实现示例

集成此方法非常简单:

<code class="language-csharp">Task[] tasks = new[] { /* ... your tasks ... */ };
await Task.WhenAll(tasks).WithAggregateExceptionHandling(); // Rethrows AggregateException with full context</code>
登录后复制

通过采用这种方法,开发人员可以有效地处理异步 C# 代码中的 AggregateExceptions,防止丢失有价值的错误信息并促进更彻底的错误处理和调试。

以上是在异步 C# 代码中处理 AggregateException 时,如何防止丢失错误信息?的详细内容。更多信息请关注PHP中文网其他相关文章!

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