Question

Pour un bloc comme celui-ci:

try:
    #some stuff
except Exception:
    pass

pylint soulève avertissement W0703 "Catch "Exception". Pourquoi?

Était-ce utile?

La solution

Il est considéré comme une bonne pratique de ne pas normalement attraper la racine objet d'exception, mais plutôt à attraper plus spécifiques - par exemple IOException

.

Considérez si une exception de mémoire a eu lieu -. Simplement en utilisant « pass » ne va pas quitter votre programme dans un bon état

A peu près la seule fois où vous devez attraper exception est au niveau supérieur de votre programme, vous pouvez (essayer de) l'enregistrer, afficher une erreur, et la sortie aussi gracieusement que possible.

Autres conseils

Il est bon de prendre seulement une fourchette très étroite de types. « Exception » est trop général - vous attrapons pas seulement les erreurs que vous avez planifiées pour, mais d'autres erreurs aussi, qui peut masquer des bugs dans votre code qui serait plus rapide pour diagnostiquer si elles ne sont pas pris du tout, ou peut-être serait être mieux traitée par un seul gestionnaire d'exception de très haut niveau.

Cela dit, depuis python2.6, attraper exception est devenu beaucoup plus raisonnable, parce que toutes les exceptions que vous ne voudriez pas attraper (SystemExit, KeyboardInterrupt) ne héritent d'exception. Ils hériteront au lieu d'un BaseException commun au lieu. Cela a été fait délibérément afin de faire attraper exception relativement inoffensif, car il est un idiome commun.

Voir PEP 3110 pour plus de détails et plans futurs.

parce qu'il pense que vous attraper trop. et il a raison.

Exception sont élevés quand quelque chose ... exceptionnel se produit. Il est généralement une bonne chose que le programme se termine.

Vous pouvez ignorer quelques exceptions, mais l'OMI il n'y a pas de bonnes raisons pour attraper une base de classe comme ça.

comme la réponse de Greg, 'Exception' est une classe de base et les exceptions devraient provenir de cette classe, voir aussi exceptions.Exception .

Voici une très utile Liste des erreurs dans pydocs

Notez également le module de retraçage très pratique qui vous permet de savoir où l'exception est survenue. En utilisant seulement « sauf: ... » vous montrer ce que vous devriez mieux erreur utiliser dans votre cas. Par exemple, essayez ce code (Toggle le commentaire), peut-être vous l'acceptez:

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 

Attraper Exception (sans re-levée) a 2 très mauvais effets secondaires: les erreurs se font manger, de sorte que vous perdez la trace de la pile, mais aussi que ctrl-c (ou quelle que soit la clé de rupture est sur votre système d'exploitation) obtient également traité ici.

Le comportement typique des programmes comme celui-ci est que soit ils ne peuvent pas être arrêtés, ou ctrl-c provoque le flux de contrôle pour sauter vers l'avant (au gestionnaire d'exception), puis continuer. Ensuite, soit le code ne peut être interrompu, ou si vous devez marteler ctrl-c pour le faire arrêter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top