web-dev-qa-db-fra.com

Éviter l'avertissement "Trop large exception clause" dans PyCharm

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?

16
Don Kirkby

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
24
Don Kirkby

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)
0
Don Kirkby