如何对 asyncio.gather() 收集的异常执行 logging.exception()?

How do I do logging.exception() on exceptions gathered by asyncio.gather()?

我非常喜欢logging.exception()返回的信息,但是这个函数只能在异常处理程序中使用。

现在,运行 asyncio.gather(..., return_exceptions=True) 不会引发异常;相反,异常作为 Exception 个对象返回。

我想用与 logging.exception() 相同的详细信息记录这些 Exceptions 对象,但由于我不在异常处理程序中,我该怎么做?

您可以获取 gather 返回的异常实例并将它们作为 exc_info 传递,例如

results = asyncio.gather(*coros, return_exceptions=True)
for exc in [r for r in results if isinstance(r, BaseException)]
    logger.debug("message", exc_info=exc)

这应该给出与 logger.exception("message") 相同的输出。

results = asyncio.gather(*coros, return_exceptions=True)
for exc  in [r.exception() for r in results]:
    if r:
        logger.error("message", exc_info=True)