Une bibliothèque tierce (écrite en C) que j'utilise dans mon code python émet des avertissements. Je veux pouvoir utiliser la try
except
syntaxe pour gérer correctement ces avertissements. Y a-t-il un moyen de faire cela?
python
exception
exception-handling
warnings
Boris Gorelik
la source
la source
warnings.filterwarnings
fait exactement ce que vous voulez, je ne comprends pas quel est votre problème?warnings.filterwarnigns('error')
Fait le travail. Je ne trouve pas la réponse originale qui proposait cette solutionRéponses:
Pour citer le manuel python ( 27.6.4. Testing Warnings ):
la source
try
except
syntaxe.fnx
retournez quelque chose, vous gardez ce résultat (et pouvez toujours gérer l'avertissement).fxn()
cela ne renvoie pas d'avertissement, il yw
aura une liste vide. Siw
est une liste vide ( par exemple[]
), en cours d' exécution alors le code vous donnera l'erreur suivante:IndexError: list index out of range
. Si vous cherchez simplement à formater ou vérifier les propriétés des avertissements capturés, il est préférable d'utiliser une boucle for:for x in w: print(f'{x.category.__name__}: {str(x.message)}')
Pour gérer les avertissements comme des erreurs, utilisez simplement ceci:
Après cela, vous serez en mesure de détecter les avertissements comme les erreurs, par exemple cela fonctionnera:
PS a ajouté cette réponse car la meilleure réponse dans les commentaires contient une faute d'orthographe:
filterwarnigns
au lieu defilterwarnings
.la source
filterwarnings
appel pour attraperWarnings
, du moins en python 3. cela fonctionne.Si vous voulez simplement que votre script échoue sur les avertissements, vous pouvez utiliser:
la source
Voici une variante qui explique plus clairement comment utiliser uniquement vos avertissements personnalisés.
la source
Dans certains cas, vous devez utiliser des ctypes pour transformer les avertissements en erreurs. Par exemple:
la source
warnings.simplefilter('error')
vous n'obtiendrez pas la trace de l'avertissement que vous avez vu dans les journaux, mais à la place, vous obtiendrez des traces d'avertissements précédemment filtrés. L'utilisationsimplefilter
est également le moyen le plus rapide d'arriver à votre réponse si vous avez une invocation CLI.