刚才已经提到了:asyncio.Task
对象具有方法result
和exception
.
result
:
[...] 如果协程引发异常,则会重新引发该异常 [...]
exception
:
[...] 如果包装的协程引发异常,则返回异常 [...]
给定一个简单的设置(在 Python 3.7 语法中):
import asyncio
tasks =[]
async def bad_test():
raise ValueError
async def good_test():
return
async def main():
tasks.append(asyncio.create_task(bad_test()))
tasks.append(asyncio.create_task(good_test()))
asyncio.run(main())
使用result
,可以这样做:
for t in tasks:
try:
f = t.result()
except ValueError as e:
logger.exception("we're all doomed")
或者,使用exception
:
for t in tasks:
if isinstance(t.exception(), Exception):
logger.exception("apocalypse now")
但是,这两种方法都需要Task
完成,否则:
如果 Task 已被取消,则此方法会引发 CancelledError 异常。
( result ):如果 Task 的结果尚不可用,则此方法会引发 InvalidStateError 异常。
(异常):如果任务尚未完成,此方法会引发 InvalidStateError 异常。
因此,与其他答案中的提议不同,当任务中出现异常时不会发生日志记录,而是在任务完成后评估任务时发生。