Les deux extraits de code suivants font la même chose. Ils interceptent chaque exception et exécutent le code dans le except:
bloc
Extrait 1 -
try:
#some code that may throw an exception
except:
#exception handling code
Extrait 2 -
try:
#some code that may throw an exception
except Exception as e:
#exception handling code
Quelle est exactement la différence entre les deux constructions?
python
python-3.x
narendranathjoshi
la source
la source
except Exception, e:
etexcept Exception as e:
. Cette question demande quelle est la différence entreexcept:
etexcept Exception as e:
.Réponses:
Dans le second, vous pouvez accéder aux attributs de l'objet d'exception:
Mais il n'attrape
BaseException
ni les exceptions qui sortent du systèmeSystemExit
,KeyboardInterrupt
etGeneratorExit
:Ce qui est nu sauf:
Consultez la section Exceptions intégrées de la documentation et la section Erreurs et exceptions du didacticiel pour plus d'informations.
la source
Exception
est dérivé deBaseException
, c'est pourquoiexcept Exception
ne pas attraperBaseException
. Si vous écrivezexcept BaseException
, il sera capturé aussi. Bareexcept
attrape tout.except
doit être le dernier d'une série deexcept
blocs, alors que vous n'obtiendrez pas d'erreur si vous mettezexcept Exception
avant d'autresexcept
blocs: ils seront simplement ignorés en silence (s'ils gèrent desException
sous-classes). Quelque chose à surveiller.except
etexcept Exception
. "Quelque chose à surveiller" semble un peu bizarre maintenant, mais à l'époque je m'attendais à ce que Python choisisse leexcept
bloc le plus spécifique , peu importe où il se trouvait, et j'ai été un peu déçu de découvrir le contraire.accepte toutes les exceptions, alors que
n'accepte que les exceptions que vous êtes censé attraper.
Voici un exemple que vous n'êtes pas censé attraper:
Le premier a fait taire le
KeyboardInterrupt
!Voici une liste rapide:
Si vous voulez en attraper un, il vaut mieux le faire
pour souligner que vous savez ce que vous faites.
Toutes les exceptions proviennent de
BaseException
, et celles que vous êtes censé attraper au jour le jour (celles qui seront lancées pour le programmeur) héritent également deException
.la source
except(Exception)
ne détecte jamais d'KeyboardInterrupt
erreurs.as e
n'a rien à voir avec ça.as e
, car j'ai supposé que ce qu'il faisait était évident.SystemExit
ou dont vous ne voulez pasKeyboardInterrupt
échapper. Ce n'est pas un cas courant, mais cela arrive.Il existe des différences à quelques exceptions près, par exemple KeyboardInterrupt.
Lecture de PEP8 :
la source
L'utilisation du deuxième formulaire vous donne une variable (nommée en fonction de la
as
clause, dans votre exemplee
) dans laexcept
portée du bloc avec l'objet d'exception qui lui est lié afin que vous puissiez utiliser les informations de l'exception (type, message, trace de pile, etc.) pour gérer l'exception dans un manoir plus spécialement conçu.la source
Une autre façon de voir cela. Consultez les détails de l'exception:
Il y a beaucoup de "choses" auxquelles accéder en utilisant la syntaxe 'as e'.
Ce code était uniquement destiné à afficher les détails de cette instance.
la source