如何捕获 Python“从未等待过协程”警告并触发 EXCEPTION

How to catch Python "coroutine was never awaited" warning and trigger an EXCEPTION

提问人:Jeremy 提问时间:9/27/2022 更新时间:9/27/2022 访问量:197

问:

我正在编写一个 python 测试套件,它经常使用异步 io。因此,我有许多测试夹具函数,这些函数被定义为“异步”,必须用“await...”来调用。有用。

但是,在编写测试时,我经常忘记“等待”。当测试运行时,它可能会输出相当多的日志记录信息,并且在中间的某个地方会有一行说“RuntimeWarning:协程'MyFixture.DoSomething'从未等待过”。

很容易在日志中错过此警告,并想知道为什么测试没有执行它应该执行的操作。

是否有可能将此运行时警告变成致命异常,这将以一种非常明显的方式停止执行,或者允许我抓住它并打开警报器和闪光灯或其他东西?

这似乎是一个显而易见的问题,但我还没有通过谷歌搜索找到任何答案!

python 异步 异常 async-await io

评论


答:

0赞 Connor Club 9/27/2022 #1

引用自 python 文档

警告控制。默认情况下,Python 的警告机制将警告消息打印到 sys.stderr。
-werror # 转换为异常

从命令行调用 python 时,add 使所有警告(runtimewarning、deprecationwarning 等)都算作异常。
这应该将您的异步运行时警告变成运行时错误(或异常,我不确定是哪个)。
-Werror

评论

0赞 Jeremy 9/30/2022
嗯,那行得通......但这不是一个非常实用的解决方案。我需要用户能够轻松运行测试;不得不使用“python -Werror .\run_tests.py”有点混乱和混乱。有没有办法在模块级配置文件或类似文件中指定此选项?
0赞 Connor Club 10/2/2022
我不太确定,但您应该编辑一个环境变量来更改默认的 python 警告级别(可以通过编程方式控制)。不确定配置文件。os.environ