Frage Fange mehrere Ausnahmen in einer Zeile (außer Block)


Ich weiß, dass ich Folgendes kann:

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

Ich kann das auch tun:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

Aber wenn ich dasselbe in zwei verschiedenen Ausnahmen machen möchte, ist das Beste, was ich mir gerade denken kann, das zu tun:

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

Gibt es irgendeine Möglichkeit, dass ich so etwas tun kann (da die Aktion in beiden Ausnahmen zu tun ist say please):

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

Nun wird das wirklich nicht funktionieren, da es der Syntax für Folgendes entspricht:

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

Also, meine Bemühungen, die zwei verschiedenen Ausnahmen zu erfassen, kommen nicht genau durch.

Gibt es eine Möglichkeit, dies zu tun?


1957
2018-06-24 15:55


Ursprung


Antworten:


Von Python-Dokumentation:

Eine except-Klausel kann beispielsweise mehrere Ausnahmen als Tupel in Klammern angeben

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Oder nur für Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Das Trennen der Ausnahme von der Variablen mit einem Komma funktioniert auch in Python 2.6 und 2.7, ist aber jetzt veraltet und funktioniert nicht in Python 3; jetzt solltest du verwenden as.


2698
2018-06-24 15:56



Wie erhalte ich mehrere Ausnahmen in einer Zeile (außer Block)

Mach das:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

Die Klammern sind aufgrund älterer Syntax erforderlich, die das Komma verwendet, um das Fehlerobjekt einem Namen zuzuordnen. Das as Schlüsselwort wird für die Zuweisung verwendet. Sie können einen beliebigen Namen für das Fehlerobjekt verwenden, ich bevorzuge error persönlich.

Beste Übung

Um dies auf eine Weise zu tun, die derzeit und vorwärts mit Python kompatibel ist, müssen Sie die Ausnahmen durch Kommas trennen und sie in Klammern umbrechen, um von früherer Syntax zu unterscheiden, die die Ausnahmeinstanz einem Variablennamen zuordnete, indem Sie dem Ausnahmetyp mit a folgen Komma.

Hier ist ein Beispiel für die einfache Verwendung:

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

Ich gebe nur diese Ausnahmen an, um zu vermeiden, dass Fehler versteckt werden. Wenn ich darauf stoße, erwarte ich die vollständige Stapelverfolgung von.

Dies ist hier dokumentiert: https://docs.python.org/tutorial/errors.html

Sie können die Ausnahme einer Variablen zuweisen, (e ist üblich, aber Sie bevorzugen möglicherweise eine ausführlichere Variable, wenn Sie eine lange Ausnahmebehandlung haben oder Ihre IDE nur eine Auswahl größer als diese hervorhebt, wie meins.) Die Instanz hat ein args-Attribut. Hier ist ein Beispiel:

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

Beachten Sie, dass in Python 3 die err Objekt fällt aus dem Rahmen, wenn die except Block ist abgeschlossen.

Veraltet

Möglicherweise sehen Sie Code, der den Fehler mit einem Komma zuweist. Diese Verwendung, die einzige in Python 2.5 und früher verfügbare Form, ist veraltet, und wenn Sie möchten, dass Ihr Code in Python 3 vorwärtskompatibel ist, sollten Sie die Syntax aktualisieren, um das neue Formular zu verwenden:

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

Wenn Sie in Ihrer Codebasis die Komma-Namenszuweisung sehen und Python 2.5 oder höher verwenden, wechseln Sie zu der neuen Vorgehensweise, damit Ihr Code beim Upgrade kompatibel bleibt.

Das suppress Kontextmanager

Die akzeptierte Antwort ist wirklich 4 Zeilen Code, mindestens:

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

Das try, except, pass Linien können in einer einzigen Zeile mit der behandelt werden Unterdrücken Sie den Kontextmanager, der in Python 3.4 verfügbar ist:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Also wenn du willst pass bei bestimmten Ausnahmen verwenden suppress.


184
2018-06-21 04:20



Für Python 2.5 und frühere Versionen lautet die korrekte Syntax:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

Woher e ist die Ausnahme-Instanz.


49
2018-05-13 12:37



Von Python-Dokumentation -> 8.3 Ausnahmen behandeln:

EIN try Anweisung kann mehr als eine except-Klausel haben, um anzugeben   Handler für verschiedene Ausnahmen. Höchstens ein Handler wird sein   hingerichtet. Handler behandeln nur Ausnahmen, die in der   entsprechende try-Klausel, nicht in anderen Handlern des gleichen versuchen   Erklärung. Eine except-Klausel kann mehrere Ausnahmen als a nennen   geklammertes Tupel, zum Beispiel:

except (RuntimeError, TypeError, NameError):
    pass

Beachten Sie, dass die Klammern um dieses Tupel erforderlich sind, weil   außer ValueError, e: war die Syntax für das, was normalerweise ist   geschrieben als except ValueError as e: im modernen Python (beschrieben   unten). Die alte Syntax wird weiterhin aus Gründen der Abwärtskompatibilität unterstützt.   Das heisst except RuntimeError, TypeError ist nicht gleichbedeutend mit    except (RuntimeError, TypeError): aber zu except RuntimeError as TypeError: was ist nicht was du willst.


37
2017-10-30 10:01



Wenn Sie häufig eine große Anzahl von Ausnahmen verwenden, können Sie ein Tupel vordefinieren, sodass Sie sie nicht mehrmals neu eingeben müssen.

#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

ANMERKUNGEN: 

  1. Wenn Sie auch andere Ausnahmen als die in der Vordefinierte Tupel, müssen Sie einen anderen außer Block definieren.

  2. Wenn Sie eine globale Variable einfach nicht tolerieren können, definieren Sie sie in main () und gib es dort hin, wo es gebraucht wird ...


15
2017-09-18 01:36



Eine Möglichkeit dies zu tun ist ..

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. 

und eine andere Möglichkeit besteht darin, eine Methode zu erstellen, die eine Aufgabe ausführt, die von ausgeführt wird except blockiere und rufe es durch alle except blockiere das du schreibst ..

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]

Ich weiß, dass der zweite nicht der beste Weg ist, um dies zu tun, aber ich zeige nur eine Anzahl von Möglichkeiten, dieses Ding zu machen.


5
2017-08-17 11:56



Python 2.7 Dokumentation besagt, dass:

Eine try-Anweisung kann mehr als eine except-Klausel zur Angabe haben   Handler für verschiedene Ausnahmen. Höchstens ein Handler wird sein   hingerichtet. Handler behandeln nur Ausnahmen, die in der   entsprechende try-Klausel, nicht in anderen Handlern des gleichen versuchen   Erklärung. Eine except-Klausel kann mehrere Ausnahmen als a nennen   geklammertes Tupel, zum Beispiel:

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

Hinweis   dass die Klammern um dieses Tupel benötigt werden, weil außer   ValueError, e: war die Syntax für das, was normalerweise als geschrieben wird   außer ValueError als e: im modernen Python (unten beschrieben). Das alte   Die Syntax wird weiterhin für die Abwärtskompatibilität unterstützt. Das heisst   außer RuntimeError ist TypeError nicht äquivalent zu except   (RuntimeError, TypeError): aber um RuntimeError als TypeError zu unterscheiden:   was ist nicht was du willst.


3
2017-12-05 14:05