是否可以在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)
但是,这不是最佳解决方案。特别是: