在异步收集中捕获异常

时间:2021-01-05 13:20:25

标签: python asynchronous exception async-await

假设有几个协程我们发送到事件循环

task_list = [task1(), task2(), task3()]
res = asyncio.gather(*task_list, return_exceptions=True)

关于文档

<块引用>

如果 return_exceptions 为 True,则异常的处理方式与 成功的结果,并汇总在结果列表中。

即例如,如果 task2 返回错误,则结果将是

res = [task1_result, task2_error, task3_result]

结果在另一个进程中进一步处理,如果响应中有错误,我想传递一些默认值。问题是如何检查 event_loop 响应中的异常。有点像(警告伪代码!)

response = default if any(res is Error) else res

1 个答案:

答案 0 :(得分:1)

您可以使用 map 函数替换默认值的结果列表中的错误。可以使用 isinstance(result, Exception) 检查结果是否为错误。像这样:

task_list = [task1(), task2()]
res = await asyncio.gather(*task_list, return_exceptions=True)  # res = ["result", ArithmeticError()]
res = list(map(lambda r: r if not isinstance(r, Exception) else default_value, res))  # res = ["result", None]