Question Attraper plusieurs exceptions dans une ligne (sauf le 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 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 faire ceci:

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

Est-il possible que je puisse faire quelque chose comme ça (puisque l'action à prendre 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 pour:

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

Donc, mon effort pour attraper les deux exceptions distinctes ne vient pas exactement à travers.

Y a-t-il un moyen de faire cela?


1957
2018-06-24 15:55


origine


Réponses:


De Documentation Python:

Une clause d'exception peut nommer plusieurs exceptions comme un tuple entre parenthèses, par exemple

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Ou, pour Python 2 uniquement:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Séparer l'exception de la variable avec une virgule fonctionnera toujours dans Python 2.6 et 2.7, mais est maintenant obsolète et ne fonctionne pas dans Python 3; maintenant vous devriez utiliser as.


2698
2018-06-24 15:56



Comment puis-je attraper plusieurs exceptions dans une 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 de l'ancienne syntaxe qui utilisait les virgules pour affecter 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 le faire d'une manière actuellement et avant compatible avec Python, vous devez séparer les Exceptions avec des virgules et les emboîter avec des parenthèses pour différencier de la syntaxe précédente qui a assigné l'instance d'exception à un nom de variable en suivant le type Exception virgule.

Voici un exemple d'utilisation simple:

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

Je ne spécifie que ces exceptions pour éviter de cacher des bogues, ce qui si je rencontre la trace de la pile complète.

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

Vous pouvez affecter l'exception à une variable, (e est commun, mais vous préférerez peut-être une variable plus verbeuse si vous avez une longue gestion des exceptions ou votre IDE ne met en évidence que des sélections plus grandes que celle-ci, comme le mien.) L'instance a un attribut args. Voici un exemple:

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

Notez que dans Python 3, le err objet tombe hors du champ lorsque le except bloc est conclu.

Déprécié

Vous pouvez voir le code qui assigne l'erreur avec une virgule. Cette utilisation, la seule forme disponible dans Python 2.5 et versions antérieures, est obsolète, et si vous souhaitez que votre code soit compatible avec Python 3, vous devez mettre à jour la syntaxe pour 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)

Si vous voyez l'assignation de 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 pour que votre code reste compatible lors de la mise à niveau.

le suppress gestionnaire de contexte

La réponse acceptée est vraiment 4 lignes de code, minimum:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

le try, except, pass lignes peuvent être traitées dans une seule ligne avec le supprimer le gestionnaire de contexte, disponible en Python 3.4:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Alors quand tu veux pass sur certaines exceptions, utilisez suppress.


184
2018-06-21 04:20



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

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

e est l'instance d'exception.


49
2018-05-13 12:37



De Documentation Python -> 8.3 Traitement des exceptions:

UNE try déclaration peut avoir plus d'une clause sauf, pour spécifier   gestionnaires pour différentes exceptions. Au plus un gestionnaire sera   réalisé. Les gestionnaires gèrent uniquement les exceptions qui se produisent dans   clause try correspondante, pas dans d'autres gestionnaires du même essai   déclaration. Une clause except peut nommer plusieurs exceptions en tant que   tuple entre parenthèses, par exemple:

except (RuntimeError, TypeError, NameError):
    pass

Notez que les parenthèses autour de ce tuple sont obligatoires, car   sauf ValueError, e: était la syntaxe utilisée pour ce qui est normalement   écrit comme except ValueError as e: en Python moderne (décrit   au dessous de). L'ancienne syntaxe est toujours prise en charge pour la rétrocompatibilité.   Ça signifie except RuntimeError, TypeError n'est pas équivalent à    except (RuntimeError, TypeError): mais à except RuntimeError as TypeError: ce qui n'est pas ce que tu veux.


37
2017-10-30 10:01



Si vous utilisez fréquemment un grand nombre d'exceptions, vous pouvez prédéfinir un tuple, vous n'avez donc pas besoin de les retaper plusieurs fois.

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

REMARQUES: 

  1. Si vous avez également besoin d'autres exceptions que celles du tuple prédéfini, vous devrez définir un autre bloc sauf.

  2. Si vous ne pouvez pas tolérer une variable globale, définissez-la dans main () et le faire circuler là où c'est nécessaire ...


15
2017-09-18 01:36



L'un des moyens de le faire est ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

et une autre façon est de créer une méthode qui exécute une tâche exécutée par except bloquer et l'appeler à travers tous les except bloquer que vous écrivez ..

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

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.


5
2017-08-17 11:56



La documentation de Python 2.7 indique que:

Une instruction try peut avoir plus d'une clause except, pour spécifier   gestionnaires pour différentes exceptions. Au plus un gestionnaire sera   réalisé. Les gestionnaires gèrent uniquement les exceptions qui se produisent dans   clause try correspondante, pas dans d'autres gestionnaires du même essai   déclaration. Une clause except peut nommer plusieurs exceptions en tant que   tuple entre parenthèses, par exemple:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

Remarque   que les parenthèses autour de ce tuple sont nécessaires, car sauf   ValueError, e: était la syntaxe utilisée pour ce qui est normalement écrit comme   sauf ValueError comme e: dans Python moderne (décrit ci-dessous). L'ancien   La syntaxe est toujours prise en charge pour la rétrocompatibilité. Ça signifie   sauf RuntimeError, TypeError n'est pas équivalent à sauf   (RuntimeError, TypeError): mais à l'exception de RuntimeError comme TypeError:   ce qui n'est pas ce que tu veux.


3
2017-12-05 14:05