Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从循环引发的python异步IO异常。创建_任务()_Python_Exception_Logging_Python Asyncio_Python Logging - Fatal编程技术网

从循环引发的python异步IO异常。创建_任务()

从循环引发的python异步IO异常。创建_任务(),python,exception,logging,python-asyncio,python-logging,Python,Exception,Logging,Python Asyncio,Python Logging,我希望我的代码使用pythonlogging来记录异常。 在我使用wait的常用代码中,异常通常会引发,因此: 试试看: 等待您可以提出的代码 例外情况除外,如e: logger.exception(“异常发生”) 很好 但是,当使用 循环。创建任务(coro()) 我不确定如何在这里捕获异常。 包装create_task()调用显然不起作用。 记录代码中每个异常的最佳解决方案是什么 记录代码中每个异常的最佳解决方案是什么 如果控制create_task的调用,但不控制coro()中的代码,则可

我希望我的代码使用python
logging
来记录异常。 在我使用
wait
的常用代码中,异常通常会引发,因此:

试试看:
等待您可以提出的代码
例外情况除外,如e:
logger.exception(“异常发生”)

很好

但是,当使用
循环。创建任务(coro())

我不确定如何在这里捕获异常。
包装create_task()调用显然不起作用。 记录代码中每个异常的最佳解决方案是什么

记录代码中每个异常的最佳解决方案是什么

如果控制
create_task
的调用,但不控制
coro()
中的代码,则可以编写日志包装器:

async def log_exceptions(awaitable):
    try:
        return await awaitable
    except Exception:
        logger.exception("Unhandled exception")
然后可以调用
循环。创建任务(记录异常(coro())


如果您不能或不想包装每个
create_task
,您可以调用,将异常设置为您自己的函数,该函数将根据您的需要记录异常。

只需提到它:
asyncio.task
对象具有方法和属性。
结果

[…]如果协同程序引发异常,则该异常为 重新提出[……]

异常

[…]如果包装的协同路由引发异常,则该异常为 返回[……]

给出一个简单的设置(使用Python 3.7语法):

使用
结果
,可以执行以下操作:

for t in tasks:
    try:
        f = t.result()
    except ValueError as e:
        logger.exception("we're all doomed")
或者,使用
异常

for t in tasks:
    if isinstance(t.exception(), Exception):
        logger.exception("apocalypse now")
但是,这两种方法都要求完成
任务
,否则:

如果任务已取消,此方法将引发CanceledError 例外

(结果):如果任务的结果尚不可用,此方法将引发 InvalidStateError异常

(异常):如果任务尚未完成,此方法将引发InvalidStateError异常


因此,与另一个答案中的建议不同,当任务中出现异常时,不会发生日志记录,而是在任务完成后进行评估时。

使用
异常除外:
而不是
异常除外:
以避免抑制
键盘中断和类似的非错误。有基于事件循环的通用解决方案吗?而不是包装每个create_任务调用。因为据我所知,异常最终会引发到事件循环中。@user3599803您可以使用
set\u exception\u handler
;查看编辑器的答案。如何在非异步函数中等待?@nurettin Good catch,我现在添加了缺少的
async
for t in tasks:
    if isinstance(t.exception(), Exception):
        logger.exception("apocalypse now")