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