从 loop.create_task() 引发的 python asyncio 异常

use*_*803 4 python logging exception python-asyncio python-logging

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

try: await code_that_can_raise() except Exception as e: logger.exception("Exception happended")

工作正常。

然而,当使用 loop.create_task(coro())

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

use*_*342 6

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

如果您控制 的调用create_task,但不控制 中的代码coro(),那么您可以编写一个日志记录包装器:

async def log_exceptions(awaitable):
    try:
        return await awaitable
    except Exception:
        logger.exception("Unhandled exception")
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话loop.create_task(log_exceptions(coro()))

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

  • [更好](/sf/answers/1035822441/) 使用 `except Exception:` 而不是 `except:` 以避免抑制 `KeyboardInterrupt` 和类似的非错误。 (2认同)