python - asyncio : loop. run_until_complete(loop.create_task(f)) 打印 "Task exception was never retrieved",即使它显然已传播

标签 python python-3.x exception coroutine python-asyncio

出于某种原因,该程序打印出以下警告:

Task exception was never retrieved
future: <Task finished coro=<coro() done, defined at /usr/lib64/python3.4/asyncio/coroutines.py:139> exception=SystemExit(2,)>

即使异常被清楚地检索和传播,因为 caught SystemExit! 被打印到终端,进程状态代码变为 2。

同样的事情也发生在 Python 2 和 trollius 上。

我错过了什么吗?

#!/usr/bin/env python3

import asyncio

@asyncio.coroutine
def comain():
    raise SystemExit(2)

def main():
    loop = asyncio.get_event_loop()
    task = loop.create_task(comain())
    try:
        loop.run_until_complete(task)
    except SystemExit:
        print("caught SystemExit!")
        raise
    finally:
        loop.close()

if __name__ == "__main__":
    main()

最佳答案

SystemExit 似乎是一个特例。例如,如果您引发并捕获 Exception,您将看不到任何错误。 解决这个问题的方法似乎是使用 Task.exception() 手动检索异常:

import asyncio

@asyncio.coroutine
def comain():
    raise SystemExit(2)

def main():
    loop = asyncio.get_event_loop()
    task = loop.create_task(comain())
    try:
        loop.run_until_complete(task)
    except SystemExit:
        print("caught SystemExit!")
        task.exception()
        raise
    finally:
        loop.close()

if __name__ == "__main__":
    main()

编辑

实际上,所有 BaseException 子类都会以这种方式运行。

关于python - asyncio : loop. run_until_complete(loop.create_task(f)) 打印 "Task exception was never retrieved",即使它显然已传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441790/

相关文章:

java - 构造函数中出现异常时java编译器出错

python - 在 Python 的调用代码中捕获 __enter__ 中的异常

python - python中的udp速率限制?

python - 查找与给定时间戳最接近的时间戳(从字典数组中)

将数据从一台 MySQL 服务器传输到另一台 MySQL 服务器的 Python 脚本

python - 在 Python 中打开一个文件进行输入和输出

python - 如何在运行时使用 argparse 有条件地获取进一步的输入?

python - 表格出现前的QtableView占位符文本

python - 根据pandas中的另一个列值有条件地填充列值

java - 多个异常抛出函数的异常处理实践