Asyncio:从未检索到任务异常异常

Ale*_*kin 5 python error-handling exception python-asyncio

假设我有一个简单的代码:

import asyncio


async def exc():
    print(1 / 0)


loop = asyncio.get_event_loop()

loop.create_task(exc())

try:
    loop.run_forever()
except KeyboardInterrupt:
    loop.stop()
    loop.close()
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我会立即收到错误消息

Task exception was never retrieved
future: <Task finished coro=<exc() done, defined at qq.py:4> exception=ZeroDivisionError('division by zero',)>
Traceback (most recent call last):
  File "qq.py", line 5, in exc
    print(1 / 0)
ZeroDivisionError: division by zero
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改loop.create_task(exc())task = loop.create_task(exc())

单击ctrl + c后,我会收到相同的错误消息

为什么任务分配会更改错误输出的时间?

kwa*_*nek 7

asyncio.Future可以使用检索Task中的异常(确切地说是基础)Future.exception()。如果未检索到该异常,则将在释放Future带有eventloop's 的对象时处理该异常call_exception_handler

因此,正如@dim所指出的,虽然Task具有引用(在您的情况下分配给变量),但是它不会被释放,因此del task_future不会被调用,也不会执行循环的处理程序。

  • 顺便说一句(虽然不是问题),正如[这个答案](/sf/answers/2125490041/)对另一个问题所指出的,使用`loop.run_until_complete(asyncio.gather(exc()) ))` 可能是最简单的解决方案。 (2认同)