在Python中,如何捕获警告,就好像它们是例外?

时间:2011-04-13 05:34:59

标签: python exception exception-handling warnings

我在python代码中使用的第三方库(用C编写)发出警告。我希望能够使用try except语法来正确处理这些警告。有没有办法做到这一点?

6 个答案:

答案 0 :(得分:80)

要处理警告错误,只需使用:

import warnings
warnings.filterwarnings("error")

在此之后,您将能够捕获与错误相同的警告,例如这将有效:

try:
    some_heavy_calculations()
except RuntimeWarning:
    import ipdb; ipdb.set_trace()

P.S。添加了此答案,因为评论中的最佳答案包含拼写错误:filterwarnigns而不是filterwarnings

答案 1 :(得分:36)

引用python手册(27.6.4. Testing Warnings):

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

答案 2 :(得分:14)

以下是一种变体,可以更清晰地说明如何使用自定义警告。

import warnings
with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")

    # Call some code that triggers a custom warning.
    functionThatRaisesWarning()

    # ignore any non-custom warnings that may be in the list
    w = filter(lambda i: issubclass(i.category, UserWarning), w)

    if len(w):
        # do something with the first warning
        email_admins(w[0].message)

答案 3 :(得分:13)

如果您只是希望脚本在警告时失败,您可以使用:

python -W error foobar.py

答案 4 :(得分:3)

在某些情况下,您需要使用ctypes将警告变为错误。例如:

str(b'test')  # no error
import warnings
warnings.simplefilter('error', BytesWarning)
str(b'test')  # still no error
import ctypes
ctypes.c_int.in_dll(ctypes.pythonapi, 'Py_BytesWarningFlag').value = 2
str(b'test')  # this raises an error

答案 5 :(得分:0)

为了完整起见,您还可以导出一个 env 变量:

PYTHONWARNINGS=error /usr/bin/run_my_python_utility