异步编程中AggregateException的处理难题
在异步编程的世界中,await
关键字提供了一种优雅的方式来暂停执行,直到任务完成。但是,当处理出错的任务时,await
会引入一个细微的问题:它会重新抛出AggregateException
中的第一个异常,从而可能丢失宝贵的错误信息。
为了解决这个问题,开发人员面临着一个难题。他们可能会求助于一些不优雅的解决方案,或者尝试使用自定义awaiter
。但是,在await
中干净地处理AggregateException
的最佳实践仍然难以捉摸。
问题的答案
与标题中的建议相反,在这种情况下await
的默认行为通常是有益的。在大多数情况下,只知道一个异常就足够了。真正的挑战在于以允许选择性异常处理的方式来处理AggregateException
。
为了实现这一点,以下扩展方法提供了一个简洁的解决方案:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // source.Exception 可能为 null,如果任务被取消。 if (source.Exception == null) throw ex; // 抛出原始异常,例如取消异常 // EDI 保留原始异常的堆栈跟踪,如果有的话。 ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
通过将await
操作封装在一个try-catch
块中,此方法允许开发人员访问AggregateException
并使用ExceptionDispatchInfo.Capture
重新抛出它。这保留了原始异常的堆栈跟踪,使开发人员能够适当地处理错误。 修改后的代码更完整地处理了任务取消的情况。
以上是使用'await”时如何最好地处理聚合异常?的详细内容。更多信息请关注PHP中文网其他相关文章!