7
votes

Décider quelles exceptions pour attraper en python

Supposons que j'utilise une bibliothèque x qui spécifie par exemple que exception.baseError est la classe de base pour toutes les exceptions de x .

Maintenant, il existe une autre exception, disons x.fooerror , lequel bien sûr hérite de exception.baseError mais est plus généralisé, disons qu'il gère une entrée non valide. Supposons qu'il y ait beaucoup d'autres classes de ce type, introduisons de baseError mais tous pour les cas généralisés. xxx

donc je veux vérifier alors vérifier une entrée non valide. Alors quelle exception devrais-je attraper? Bien sûr, attraper chaque exception individuelle n'est pas possible, donc j'attrape le x.baseerror , puis imprimez un message d'erreur. Ou je peux attraper le x.fooerror spécifiquement, mais puis je manque tous les autres cas d'erreur.

est-ce la manière standard de le faire - attraper l'exception de base? Si oui, alors pourquoi les autres exceptions existent-elles? Pour le cas généralisé lorsque nous voulons attraper une exception spécifique?


0 commentaires

3 Réponses :


3
votes

Comme d'habitude, il y a de bons conseils dans PEP-8 , style Guide pour le code Python:

Lorsque vous attrapez des exceptions, mention spécifique exceptions chaque fois que possible au lieu d'utiliser un à l'exception de: . < / p>

Il y a beaucoup plus dedans là-bas, mais c'est inutile de le reproduire ici.

Dans ce cas, j'attraperais les détails, devais-je les gérer différemment à un baseError et le baseError pour ceux qui nécessitent Manipulation plus générale. Je m'arrêterais bien d'attraper l'exception intégrée , cependant.


1 commentaires

Notez que je n'ai jamais dit un nu sauf clause. Je demande à la différence entre attraper le baseError qui est la classe de base vs le fooError qui est plus généralisé.



11
votes

attraper uniquement les exceptions que vous pouvez gérer. Si vous pouvez gérer à la fois l'exception de base et l'exception dérivée, alors attrapez les deux. Mais assurez-vous d'abord de mettre l'exception dérivée d'abord, car le premier gestionnaire d'exception a trouvé que correspond à celui utilisé.

try:
  X.foo()
except X.FooError:
  pass
except X.BaseError:
  pass


4 commentaires

Mais pourquoi attraper le dérivé du tout, lorsque la base peut tout gérer?


Parce que vous voudrez peut-être gérer l'exception dérivée de manière différente de l'exception de base.


Mais si je ne veux pas gérer l'exception spécifique d'une manière différente, utilise la classe d'exception de base d'accord?


Absolument. Toutes les exceptions à exception dérivées sont également des instances de l'exception de base.



2
votes

Vous attrapez une exception spécifique en le définissant dans le sauf la clause , donc: x

remarque Vous pouvez gérer plusieurs classes d'exception en les répertoriant dans une tuple.


2 commentaires

Merci de votre réponse, veuillez consulter mon commentaire dans la réponse de Ignacio.


@A A: Pas de problème; @Ignacio m'a battu