3831 votes

Interceptez les exceptions multiples en une seule ligne (sauf bloc)

Je sais que je peux faire:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

Je peux aussi faire ceci:

try:
    # do something that may fail
except IDontLikeYourFaceException:
    # put on makeup or smile
except YouAreTooShortException:
    # stand on a ladder

Mais si je veux faire la même chose à l'intérieur de deux exceptions, le meilleur je pense dès maintenant est de faire ceci:

try:
    # do something that may fail
except IDontLIkeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

Est-il possible que je peux faire quelque chose comme ceci (étant donné que les mesures à prendre dans les deux exceptions est-à - say please):

try:
    # do something that may fail
except IDontLIkeYouException, YouAreBeingMeanException:
    # say please

Maintenant, cela ne marchera pas, car il correspond à la syntaxe:

try:
    # do something that may fail
except Exception, e:
    # say please

Donc, mon effort pour attraper les deux exceptions ne correspond pas exactement à venir à travers.

Est-il un moyen de faire cela?

5090voto

bernie Points 44206

Placer entre parenthèses :

Séparer l’exception de la variable par une virgule fonctionnera toujours en Python 2.6 et 2.7, mais est désormais obsolète et ne fonctionne pas en Python 3 ; maintenant, vous devez utiliser `` .

525voto

Aaron Hall Points 7381

Pour ce faire, d'une manière actuellement et compatible avec Python, vous devez séparer les Exceptions avec des virgules et les envelopper avec des parenthèses pour se distinguer de la précédente syntaxe qui a attribué l'exception de l'instance à un nom de variable par la suite le type d'Exception à être attiré par une virgule. Voici un exemple simple de l'usage moderne: je suis actuellement en enveloppant ma main avec une prise pour KeyboardInterrupt et EOFError de sorte que l'utilisateur peut laisser un interactive clavier d'entrée de la session semi-gracieusement avec Ctrl+D ou Ctrl+C:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary for Python 3
    quit(0)

Je suis la spécification de ces exceptions pour éviter de cacher les bugs, qui, si je le rencontre je m'attends à du full stack trace.

Ceci est documenté ici: https://docs.python.org/tutorial/errors.html

Vous pouvez affecter l'exception d'une variable (e est commun, mais vous pourriez préférer un plus détaillé variable si vous avez depuis longtemps la gestion des exceptions et votre IDE en évidence de sélections plus grands que cela, comme la mienne.) L'instance a un attribut args. Voici un exemple:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print err
    print err.args
    quit(0)

Vous pouvez voir le code qui affecte l'erreur avec une virgule. Cette utilisation, la seule forme disponible dans Python 2.5 et les versions antérieures, est obsolète, et si vous souhaitez que votre code soit compatible Python 3, vous devez mettre à jour la syntaxe à utiliser le nouveau formulaire:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

73voto

fedorqui Points 42938

À partir de la documentation Python -> 8.3 gestion des Exceptions:

Un try déclaration peut avoir plus d'un, sauf clause, à préciser les gestionnaires d'exceptions. Tout au plus un gestionnaire sera exécutée. Les gestionnaires de gérer uniquement les exceptions qui se produisent dans le correspondant essayer clause, pas dans d'autres gestionnaires de la même essayer l'énoncé. Une exception à la clause de nom plusieurs exceptions comme entre parenthèses tuple, par exemple:

except (RuntimeError, TypeError, NameError):
    pass

Notez que les parenthèses autour de ce n-uplet sont nécessaires, parce que sauf ValueError, e: a été la syntaxe utilisée pour ce qui est normalement écrit comme except ValueError as e: moderne Python (décrit ci-dessous). L'ancienne syntaxe est toujours pris en charge pour assurer la compatibilité ascendante. Cela signifie except RuntimeError, TypeError n'est pas équivalent à except (RuntimeError, TypeError): mais except RuntimeError as TypeError: ce qui n'est pas ce que vous voulez.

54voto

schurlix Points 119

Pour python 2.5 et les versions antérieures, la syntaxe correcte est :

Où `` correspond à l’instance de l’Exception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X