Сторонняя библиотека (написанная на C), которую я использую в своем коде на Python, выдает предупреждения. Я хочу иметь возможность использовать try
except
синтаксис для правильной обработки этих предупреждений. Есть ли способ сделать это?
python
exception
exception-handling
warnings
Борис Горелик
источник
источник
warnings.filterwarnings
делает именно то, что вы хотите, я не понимаю, в чем ваша проблема?warnings.filterwarnigns('error')
делает свою работу. Я не могу найти оригинальный ответ, предлагающий это решениеОтветы:
Цитата из справочника Python ( 27.6.4. Предупреждения при тестировании ):
источник
try
except
синтаксис.fnx
что-то возвращает, вы сохраняете этот результат (и по-прежнему можете управлять предупреждением).fxn()
когда предупреждение не возвращается, тогдаw
будет пустой список. Еслиw
это пустой список (т.е.[]
), а затем запустить код даст вам следующее сообщение об ошибке:IndexError: list index out of range
. Если вы просто хотите отформатировать или проверить свойства зафиксированных предупреждений, то лучше использовать цикл for:for x in w: print(f'{x.category.__name__}: {str(x.message)}')
Чтобы обрабатывать предупреждения как ошибки, просто используйте это:
После этого вы сможете получать предупреждения так же, как и ошибки, например, это будет работать:
PS Добавил этот ответ, потому что лучший ответ в комментариях содержит орфографическую ошибку:
filterwarnigns
вместоfilterwarnings
.источник
filterwarnings
вызов, чтобы пойматьWarnings
, по крайней мере, в python 3. он просто работает.Вот вариант, который поясняет, как работать только с вашими настраиваемыми предупреждениями.
источник
Если вы просто хотите, чтобы сценарий завершался ошибкой при предупреждении, вы можете вызвать его
python
с-W
аргументом :источник
В некоторых случаях вам нужно использовать ctypes, чтобы превратить предупреждения в ошибки. Например:
источник
warnings.simplefilter('error')
вы не получите обратную трассировку для предупреждения, которое вы видели в журналах, а вместо этого получите обратную трассировку из ранее отфильтрованных предупреждений. Использованиеsimplefilter
также является самым быстрым способом получить ответ, если у вас есть вызов CLI.