当前位置:  开发笔记 > 编程语言 > 正文

asyncio:loop.run_until_complete(loop.create_task(f))打印出"永远不会检索到任务异常",即使它已经被传播了

如何解决《asyncio:loop.run_until_complete(loop.create_task(f))打印出"永远不会检索到任务异常",即使它已经被传播了》经验,为你挑选了1个好方法。

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

Task exception was never retrieved
future:  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()

Jashandeep S.. 7

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子类都会以这种方式运行.



1> Jashandeep S..:

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子类都会以这种方式运行.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有