从循环引发的python异步IO异常。创建_任务()
我希望我的代码使用python从循环引发的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()中的代码,则可
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")