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

2024-03-29 10:14:12 发布

您现在位置:Python中文网/ 问答频道 /正文

到底有没有什么好消息警告。警告()在warn()调用后仍执行其余代码时,要捕获的函数是否为调用方?我遇到的问题是函数b将警告。警告()如果发生了什么,我希望该函数的其余部分完成它的工作并返回它实际执行的操作的列表。如果抛出了警告,我希望捕获它,通过电子邮件将其发送给某人,并在从另一个模块调用该函数时继续,但这并没有发生。下面是代码中的内容:

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)

Tags: 模块函数代码answer警告列表电子邮件arg
1条回答
网友
1楼 · 发布于 2024-03-29 10:14:12

是的,警告可以在不退出函数的情况下发出警告。但是你想做的事情是行不通的。你知道吗

^{}the ^{} action一起使用意味着您显式地要求Python将每个警告作为一个例外。Python异常模型没有任何方法从抛出异常的点恢复。你知道吗

你可以重新组织你的代码,在每一个可能的警告之后提供显式的方法来“做剩下的”,但是对于非常重要的情况,你要么做大量的工作,要么建立一个黑客的继续传递机制。你知道吗


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

当然,一旦构建了这个,就可以使用完全相同的处理程序来获取从高严重性日志消息发送到其他记录器的电子邮件,或者添加运行时配置,这样就可以在不部署服务器的全新构建的情况下调高和降低电子邮件阈值,等等。你知道吗


如果您还没有使用logging,那么手动钩住警告可能更容易。正如the ^{} 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鼓励您monkeypatch stdlib模块。执行此操作的代码如下所示:

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

相关问题 更多 >