J'écris une clause d'exception au plus haut niveau d'un script et je veux juste qu'elle enregistre toutes les erreurs qui pourraient se produire. Ennuyeux, PyCharm se plaint si je découvre Exception
.
import logging
logging.basicConfig()
try:
raise RuntimeError('Bad stuff happened.')
except Exception: # <= causes warning: Too broad exception clause
logging.error('Failed.', exc_info=True)
Y at-il quelque chose qui ne va pas avec ce gestionnaire? Si non, comment puis-je dire à PyCharm de se taire?
D'après un commentaire de Joran : vous pouvez utiliser # noinspection PyBroadException
pour indiquer à PyCharm que vous êtes d'accord avec cette clause d'exception. C’est ce que je recherchais à l’origine, mais j’ai manqué l’option de supprimer l’inspection dans le menu des suggestions.
import logging
logging.basicConfig()
# noinspection PyBroadException
try:
raise RuntimeError('Bad stuff happened.')
except Exception:
logging.error('Failed.', exc_info=True)
Si vous ne voulez même pas vous connecter l'exception, et que vous voulez juste la supprimer sans que PyCharm se plaint, il existe une nouvelle fonctionnalité dans Python 3.4: contextlib.suppress()
.
import contextlib
with contextlib.suppress(Exception):
raise RuntimeError('Bad stuff happened.')
C'est équivalent à ceci:
try:
raise RuntimeError('Bad stuff happened.')
except Exception:
pass
J'ai trouvé un indice dans cette demande fermée feature pour PyCharm:
Je vous suggère de marquer cette inspection comme «ok» si le bloc except utilise l’instance d’exception
e
.
Comme je me connecte avec exc_info=True
, j'utilise implicitement l'objet exception actuel, mais PyCharm ne le sait pas. Pour le rendre explicite, je peux faire quelque chose d'un peu difficile: exc_info
peut utiliser n'importe quelle valeur de vérité pour inclure une trace de pile dans le journal. Un objet exception devrait être une vérité, car ce n'est pas None
.
import logging
logging.basicConfig()
try:
raise RuntimeError('Bad stuff happened.')
except Exception as e:
logging.error('Failed.', exc_info=e)