Uma biblioteca de terceiros (escrita em C) que uso em meu código python está emitindo avisos. Quero ser capaz de usar a try
except
sintaxe para lidar adequadamente com esses avisos. Existe uma maneira de fazer isso?
python
exception
exception-handling
warnings
Boris Gorelik
fonte
fonte
warnings.filterwarnings
faz exatamente o que você quer, não entendo qual é o seu problema com isso?warnings.filterwarnigns('error')
faz o trabalho. Não consigo encontrar a resposta original que propôs esta soluçãoRespostas:
Para citar o manual do python ( 27.6.4. Advertências de teste ):
fonte
try
except
sintaxe.fnx
retornar algo, você mantém esse resultado (e ainda pode gerenciar o aviso).fxn()
não retornar um aviso, entãow
será uma lista vazia. Sew
é uma lista vazia (ou seja[]
), então executar o código lhe dará o seguinte erro:IndexError: list index out of range
. Se você está apenas procurando formatar ou verificar as propriedades dos avisos capturados, é melhor usar um loop for:for x in w: print(f'{x.category.__name__}: {str(x.message)}')
Para lidar com avisos como erros, basta usar isto:
Depois disso, você será capaz de capturar os mesmos avisos que os erros, por exemplo, isso funcionará:
PS Adicionada esta resposta porque a melhor resposta nos comentários contém erro ortográfico: em
filterwarnigns
vez defilterwarnings
.fonte
filterwarnings
chamada para capturarWarnings
, pelo menos em python 3. ela simplesmente funciona.Se você apenas deseja que o script falhe em avisos, você pode usar:
fonte
Aqui está uma variação que torna mais claro como trabalhar apenas com seus avisos personalizados.
fonte
Em alguns casos, você precisa usar ctypes para transformar avisos em erros. Por exemplo:
fonte
warnings.simplefilter('error')
isso, você não obterá o rastreamento do aviso que viu nos logs, mas sim obterá os rastreamentos de avisos filtrados anteriormente. Usarsimplefilter
também é a maneira mais rápida de chegar à sua resposta se você tiver alguma chamada de CLI.