Можно ли перехватить все предупреждения, выданные в блоке try в python? - PullRequest
1 голос
/ 03 апреля 2019

У меня есть некоторый код, который схематично выглядит следующим образом:

from logging import warning

def complex_function():
    # Do some stuff
    raise Warning("blah") 
    # Do some more stuff
    raise Warning("Blah again") 

try: 
    complex_function()
except Warning as e: 
    warning(e) 

Это приводит к:

WARNING:root:blah

Я хотел бы перехватить все предупреждения и записать их в журнал.В моем коде такие предупреждения иногда приходят из сторонних библиотек, поэтому нецелесообразно изменять предупреждения на месте для использования logging.warning, и я также хочу сохранить информацию с предупреждением, чтобы я мог вернуть некоторую версию этой информации черезAPI.

Есть ли способ для меня, чтобы сделать что-то вроде этого, что перехватывает все предупреждения и циклы над ними?

edit

Слишком поздно, я понимаю,что в приведенном выше примере я выдвигаю предупреждения неправильно, и complex_function должно быть чем-то длинным:

def complex_function():
    # Do some stuff
    warnings.warn("blah") 
    # Do some more stuff
    warnings.warn("Blah again", UnknownWarningType)

И я думаю, что я могу поймать их с помощью warnings.catch_warnings

1 Ответ

2 голосов
/ 03 апреля 2019

Вы ожидали что-то вроде следующего:

import warnings
warnings.filterwarnings('error')


def warning_func():
    print('hello')
    warnings.warn(Warning('Warn1'))
    print('hi')
    warnings.warn(Warning('Warn2'))


with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter("always")
    warning_func()
    print(w)
...