保证异常传播的即发即忘
在“即发即弃”方法中,调用方法时无需等待其完成或处理其结果。然而,当一个方法返回一个任务时,它并不是真正的“即发即忘”。任务中抛出的异常不会传播到调用上下文。
为了确保“Fire and Forget”方法中的异常得到处理或升级,建议修改扩展方法如下:
public static async void Forget(this Task task) { await task; }
通过等待任务,任务中抛出的任何异常都将传播到调用上下文并进行处理或升级
处理“Fire and Forget”方法中的预期异常
最初的问题引起了对可能在“Fire and Forget”方法中抛出预期和可忽略异常的方法的担忧。忘记”的上下文。为了解决这个问题,可以修改扩展方法以接受可接受的异常类型列表:
public static async void Forget(this Task task, params Type[] acceptableExceptions) { try { await task.ConfigureAwait(false); } catch (Exception ex) { // TODO: consider whether derived types are also acceptable. if (!acceptableExceptions.Contains(ex.GetType())) throw; } }
这允许调用者指定应忽略哪些异常类型以及应升级哪些异常类型,从而提供对“Fire and Forget”方法中的异常处理行为。
以上是如何处理'即发即忘”异步方法中的异常?的详细内容。更多信息请关注PHP中文网其他相关文章!