В Python, как можно ловить предупреждения, как если бы они были исключениями? - PullRequest
72 голосов
/ 13 апреля 2011

Сторонняя библиотека (написанная на C), которую я использую в своем коде python, выдает предупреждения.Я хочу использовать синтаксис try except для правильной обработки этих предупреждений.Есть ли способ сделать это?

Ответы [ 5 ]

84 голосов
/ 21 мая 2015

Для обработки предупреждений как ошибок просто используйте это:

import warnings
warnings.filterwarnings("error")

После этого вы сможете ловить предупреждения так же, как ошибки, например, это будет работать:

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

PS Добавленоэтот ответ, потому что лучший ответ в комментариях содержит орфографические ошибки: filterwarnigns вместо filterwarnings.

37 голосов
/ 13 апреля 2011

Цитировать из руководства по питону ( 27.6.4. Тестирование предупреждений ):

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)
14 голосов
/ 26 августа 2011

Вот вариант, который упрощает работу только с вашими пользовательскими предупреждениями.

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)
13 голосов
/ 22 августа 2016

Если вы просто хотите, чтобы ваш скрипт не работал с предупреждениями, вы можете использовать:

python -W error foobar.py
3 голосов
/ 30 января 2018

В некоторых случаях вам нужно использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...