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