让我们假设我有一个简单的代码:
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()
如果我运行它,我会立即收到错误消息
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
但是,如果我将loop.create_task(exc())
更改为task = loop.create_task(exc())
点击ctrl + c
后,我会收到相同的错误消息为什么任务分配会改变输出错误的时间?
答案 0 :(得分:5)
可以使用asyncio.Future
检索任务中的异常(基础Future.exception()
准确)。如果未检索到,则会在发布Future
对象并使用eventloop call_exception_handler
时处理该异常。
所以,正如@dim指出的那样,虽然任务有引用(在你的情况下分配给变量)它不会被释放,因此del task_future
不会被调用,循环&#39 ; s处理程序也不会被执行。