Подтвердить что ты не робот

В Python, как вы улавливаете предупреждения, как если бы они были исключениями?

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

4b9b3361

Ответ 1

Чтобы процитировать из справочника python (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)

(править: фиксированный пример, был отключен раздел)

Ответ 2

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

import warnings
warnings.filterwarnings("error")

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

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

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

Ответ 3

Здесь приведена вариация, позволяющая уточнить, как работать только с вашими пользовательскими предупреждениями.

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)

Ответ 4

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

python -W error foobar.py