Comment intercepter plusieurs exceptions sur une seule ligne (sauf le bloc)
Faites ceci:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
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ère error
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
Notez qu'en Python 3, l' err
objet tombe hors de portée lorsque le except
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
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 contexte
La réponse acceptée est en réalité 4 lignes de code, au minimum:
try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
Le try
, except
, les pass
lignes peuvent être traitées en une seule ligne avec le gestionnaire de contexte de suppression, disponible en Python 3.4 :
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
Donc, quand vous voulez pass
sur certaines exceptions, utilisez suppress
.