如何处理事件循环中任何任务的异常?

时间:2018-12-09 03:44:39

标签: python-asyncio

如果任何任务在任何地方引发了未处理的异常,我想停止程序,即事件循环。正常的行为是,您收到一条Task exception was never retrieved错误消息,并且单个任务停止,但是循环继续运行所有其他任务。

例如:

import asyncio

async def foo():
    while True:
        await asyncio.sleep(1)
        print("hi")

async def bug():
    await asyncio.sleep(2)
    raise TypeError

loop = asyncio.get_event_loop()
loop.create_task(foo())
loop.create_task(bug())
loop.run_forever()

输出:

"hi"
"hi"
Task exception was never retrieved
future: <Task finished coro=<bug() done, defined at <...>:9> exception=TypeError()>
Traceback (most recent call last):
  File "<ipython-input-4-bd8651340a75>", line 11, in bug
    raise TypeError
TypeError
"hi"
"hi"
"hi"
...

我的项目包含许多分布在许多文件中的协程,这些协程通过loop.create_task(foo())相互添加到循环中,因此,由于它们彼此之间不是await,因此您不能简单地处理一个或两个入口点协程在主文件中,并冒出错误。

1 个答案:

答案 0 :(得分:0)

我想我已经用loop.set_exception_handler(handler)找到了我想要的东西