如何在Python中捕获警告?

时间:2020-03-24 12:55:42

标签: python python-3.x exception

是否可以在Python中捕获警告?

例如,我有一个函数,当输入可能导致输出不准确时,会向调用者发出警告。我有一个runner函数,它在值列表上调用此函数,在这里,我不想记录警告,而不是在终端上显示警告。我尝试过:

var contact = connectedSession.getOrCreateContact($("#pntNum").val());
var call = contact.call(null, {audioOnly: true});
if (call !== null) {
    if (call.getContact().userData.audioDevicePresent == "true") {
            setCallListeners(call);
            addHangupButton(call.getId());
            hideMuteButtons();
        } 
    } else {
        console.warn('Please make sure that your machine has audio device installed.');
    }
} else {
    console.warn("Cannot establish call");
}

但这不起作用:

import logging
import warnings


def func(val):
    if val < 0.5:
        warnings.warn("`val` smaller than 0.5")


    return val - 0.5

def run():
    vals = [0.1, 0.2, 1]

    for i, val in enumerate(vals):
        try:
            print(func(val))
        except UserWarning as w:
            logging.warning("got warning on value at index %d: %s",
                            i, str(w))

然后,我了解了catch_warnings个竞赛经理,并将>>> run() module.py:14: UserWarning: `val` smaller than 0.5 warnings.warn("`val` smaller than 0.5") -0.4 -0.3 0.5 更改为:

run

这确实引发异常并运行def run(): vals = [0.1, 0.2, 1] for i, val in enumerate(vals): try: with warnings.catch_warnings(): warnings.filterwarnings('error') print(func(val)) except UserWarning as w: logging.warning("got warning on value at index %d: %s", i, str(w)) 块,但在except调用之后不执行代码的一部分:

warnings.warn

这是一种在仍然保持警告状态的同时捕捉警告的方法,即在发出警告后不停止程序执行吗?


更新

发布问题后,我发现了logging.captureWarnings。以下将导致记录警告:

>>> run()                                                             
WARNING:root:got warning on value at index 0: `val` smaller than 0.5            
WARNING:root:got warning on value at index 1: `val` smaller than 0.5            
0.5                                                                             

输出显示:

def run():
    vals = [0.1, 0.2, 1]

    logging.captureWarnings(True)

    for i, val in enumerate(vals):
        print(func(val))

    logging.captureWarnings(False)

但是,这不是最佳解决方案。特别是:

  • 呼叫者无法自定义警告消息。 (理想情况下,我想记录导致发出警告的值的索引。)
  • 仅记录一条警告,而我希望每个有问题的值输入一条警告。

0 个答案:

没有答案
相关问题