Je sais que je peux faire:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
Je peux aussi faire ça:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreTooShortException:
# stand on a ladder
Mais si je veux faire la même chose à l'intérieur de deux exceptions différentes, le mieux que je puisse penser en ce moment est de le faire:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreBeingMeanException:
# say please
Existe-t-il un moyen de faire quelque chose comme ça (puisque l'action à entreprendre dans les deux exceptions est de say please
):
try:
# do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
# say please
Maintenant, cela ne fonctionnera vraiment pas, car il correspond à la syntaxe de:
try:
# do something that may fail
except Exception, e:
# say please
Donc, mon effort pour attraper les deux exceptions distinctes ne passe pas exactement.
Y a-t-il un moyen de faire cela?
python
exception
exception-handling
inspecteurG4dget
la source
la source
Réponses:
Depuis la documentation Python :
Ou, pour Python 2 uniquement:
Séparer l'exception de la variable par une virgule fonctionnera toujours dans Python 2.6 et 2.7, mais est désormais obsolète et ne fonctionne pas dans Python 3; maintenant vous devriez utiliser
as
.la source
list
, et ça a donné unTypeError
. On dirait que les erreurs doivent être dans untuple
pour que la capture fonctionne comme prévu.except
ligne. Il n'est nécessairement entre parenthèses que s'il est créé dans laexcept
ligne.2 + (x * 2)
,(x * 2)
n'est certainement pas un tuple. Les parenthèses sont une construction de regroupement générale. La caractéristique qui définit un tuple est qu'il contient une virgule - voir la documentation Python : "Notez que c'est en fait la virgule qui fait un tuple, pas les parenthèses."Faites ceci:
Les parenthèses sont requises en raison d'une syntaxe plus ancienne qui utilisait les virgules pour attribuer l'objet d'erreur à un nom. Le
as
mot-clé est utilisé pour l'affectation. Vous pouvez utiliser n'importe quel nom pour l'objet d'erreur, je préfèreerror
personnellement.Meilleur entrainement
Pour ce faire d'une manière actuellement et à l'avenir compatible avec Python, vous devez séparer les exceptions avec des virgules et les encapsuler avec des parenthèses pour différencier de la syntaxe précédente qui affectait l'instance d'exception à un nom de variable en suivant le type d'exception à intercepter avec un virgule.
Voici un exemple d'utilisation simple:
Je ne spécifie que ces exceptions pour éviter de masquer les bogues, ce qui, si je le rencontre, m'attend à la trace complète de la pile.
Ceci est documenté ici: https://docs.python.org/tutorial/errors.html
Vous pouvez attribuer l'exception à une variable (
e
c'est courant, mais vous préférerez peut-être une variable plus détaillée si vous avez une longue gestion des exceptions ou si votre IDE ne met en surbrillance que des sélections plus grandes que la mienne.) L'instance a un attribut args. Voici un exemple:Notez qu'en Python 3, l'
err
objet tombe hors de portée lorsque leexcept
bloc est terminé.Obsolète
Vous pouvez voir du code qui attribue l'erreur avec une virgule. Cette utilisation, le seul formulaire disponible dans Python 2.5 et versions antérieures, est déconseillée, et si vous souhaitez que votre code soit compatible avec Python 3, vous devez mettre à jour la syntaxe pour utiliser le nouveau formulaire:
Si vous voyez l'attribution du nom de virgule dans votre base de code et que vous utilisez Python 2.5 ou supérieur, passez à la nouvelle façon de le faire afin que votre code reste compatible lors de la mise à niveau.
Le
suppress
gestionnaire de contexteLa réponse acceptée est en réalité 4 lignes de code, au minimum:
Le
try
,except
, lespass
lignes peuvent être traitées en une seule ligne avec le gestionnaire de contexte de suppression, disponible en Python 3.4 :Donc, quand vous voulez
pass
sur certaines exceptions, utilisezsuppress
.la source
suppress
, beaucoup plus facile à lire que de simplement fairepass
surexcept
De la documentation Python -> 8.3 Gestion des exceptions :
la source
Si vous utilisez fréquemment un grand nombre d'exceptions, vous pouvez prédéfinir un tuple, vous n'avez donc pas à les retaper plusieurs fois.
REMARQUES:
Si vous devez également intercepter d'autres exceptions que celles du tuple prédéfini, vous devrez en définir un autre sauf le bloc.
Si vous ne pouvez tout simplement pas tolérer une variable globale, définissez-la dans main () et passez-la où vous le souhaitez ...
la source
L'une des façons de le faire est ..
et une autre façon est de créer une méthode qui exécute la tâche exécutée par
except
bloc et de l'appeler à travers tout leexcept
bloc que vous écrivez.Je sais que le second n'est pas la meilleure façon de le faire, mais je montre juste un certain nombre de façons de faire cette chose.
la source
except
clauses est normal lorsque vous souhaitez gérer les exceptions différemment.