python - 警告可以在不从函数返回的情况下发出警告吗?

标签 python

是否有办法将 warnings.warn() 函数捕获为调用者,同时在 warn() 调用后仍然执行其余代码?我遇到的问题是,如果发生某些情况,函数 b 将 warnings.warn() ,然后我希望该函数的其余部分完成其工作并返回它实际执行的操作的列表。如果抛出警告,我想捕获它,通过电子邮件将其发送给某人,然后在我从另一个模块调用该函数时继续,但这种情况没有发生。代码如下:

import warnings
def warn_function(arg_1):
    if arg_1 > 10:
        warnings.warn("Your argument was greater than 10.")
    return arg_1 - 5

with warnings.catch_warnings():
    warnings.filterwarnings("error")
    try:
        answer = warn_function(20)
    except Warning:
        print("A warning was thrown")
    finally:
        print(answer)

最佳答案

是的,警告可以在不退出函数的情况下发出警告。但你尝试做事的方式是行不通的。

使用catch_warningsthe "error" action意味着您明确要求 Python 将每个警告作为异常引发。而且Python异常模型没有任何方法可以从抛出异常的地方恢复。

可以重新组织代码,以提供明确的方法来在每次可能的警告后“完成剩下的工作”,但对于重要的情况,您要么最终要做大量的工作,要么构建一个黑客连续传递机制。

<小时/>

处理您的用例的正确方法是 logging.captureWarnings 。这样,所有警告都会发送到名为 'py.warnings' 的记录器,而不是通过正常的警告路径。然后,您可以配置一个日志处理程序,通过电子邮件将这些警告发送给某人,这样就完成了。

当然,一旦您构建了此程序,您就可以使用完全相同的处理程序来获取从高严重性日志消息发送到其他记录器的电子邮件,或者添加运行时配置,以便您可以上下调整电子邮件阈值无需部署全新的服务器版本,等等。

<小时/>

如果您尚未使用日志记录,手动 Hook 警告可能会更容易。如the warnings introduction解释:

The printing of warning messages is done by calling showwarning(), which may be overridden; the default implementation of this function formats the message by calling formatwarning(), which is also available for use by custom implementations.

是的,Python 鼓励您对 stdlib 模块进行 Monkeypatch。执行此操作的代码如下所示:

def showwarning(message, category, filename, lineno, file=None, line=None):
    fmsg = warning.formatwarning(message, category, filename, lineno, line)
    # send fmsg by email
warning.showwarning = showwarning

关于python - 警告可以在不从函数返回的情况下发出警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702471/

相关文章:

python - 已通过 Selenium 使用 GeckoDriver Firefox 丢弃浏览上下文

python - 运行 __main__.py 时,获取当前模块

python - Django - 内联(没有外键)

python - 使用胡克定律近似 F

python : How to add vertical scroll in RecycleView

python - 如何合并 Pandas 中的列?

python - Pandas:DataFrame 的复杂转换

python - Google Places API 返回不正确\不完整的地点

python - 如何将输入压缩到 txt 文件中?

python - 如何通过部分标签过滤pandas数据框列