it-swarm.com.de

Mehrere Ausnahmen in einer Zeile abfangen (außer Block)

Ich weiß, dass ich Folgendes kann:

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

Das kann ich auch:

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

Aber wenn ich dasselbe in zwei verschiedenen Ausnahmen tun möchte, ist das Beste, was ich mir jetzt vorstellen kann, Folgendes:

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

Gibt es eine Möglichkeit, wie ich so etwas tun kann (da die Aktion, die in beiden Ausnahmen ausgeführt werden muss, say please ist):

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

Das wird jetzt wirklich nicht funktionieren, da es der Syntax für:

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

Mein Versuch, die beiden Ausnahmen zu erfassen, kommt also nicht gerade zustande.

Gibt es eine Möglichkeit, dies zu tun?

2415
inspectorG4dget

From Python Documentation :

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 weiterhin in Python 2.6 und 2.7, ist jedoch veraltet und funktioniert nicht in Python 3; Jetzt sollten Sie as verwenden.

3276
bernie

Wie fange ich mehrere Ausnahmen in einer Zeile ab (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 einer älteren Syntax erforderlich, bei der das Fehlerobjekt mit Kommas einem Namen zugewiesen wurde. Das Schlüsselwort as wird für die Zuweisung verwendet. Sie können einen beliebigen Namen für das Fehlerobjekt verwenden, ich persönlich bevorzuge error.

Beste Übung

Um dies auf eine Art und Weise zu tun, die aktuell und vorwärtskompatibel mit Python ist, müssen Sie die Ausnahmen durch Kommas trennen und in Klammern setzen, um sich von der früheren Syntax zu unterscheiden, in der die Ausnahmeinstanz einem Variablennamen zugewiesen wurde, indem Sie dem Ausnahmetyp folgen, der mit a abgefangen werden soll Komma.

Hier ist ein Beispiel für eine einfache Verwendung:

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

Ich gebe nur diese Ausnahmen an, um zu vermeiden, dass Fehler ausgeblendet werden. Wenn ich darauf stoße, erwarte ich den vollständigen Stack-Trace 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 lange Ausnahmebehandlungen haben oder Ihr IDE nur größere Auswahlen hervorhebt, als meine tut.) Die Instanz hat ein Attribut args. Hier ist ein Beispiel:

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

Beachten Sie, dass in Python 3 das Objekt err den Gültigkeitsbereich verlässt, wenn der Block except abgeschlossen ist.

Veraltet

Möglicherweise sehen Sie Code, der den Fehler mit einem Komma zuweist. Diese Verwendung, die einzige Form, die in Python 2.5 und früheren Versionen verfügbar ist, ist veraltet. Wenn Ihr Code in Python 3 vorwärtskompatibel sein soll, sollten Sie die Syntax aktualisieren, um die zu verwenden neue Form:

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

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

Der suppress Kontextmanager

Die akzeptierte Antwort ist mindestens 4 Zeilen Code:

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

Die Zeilen try, except, pass können in einer einzelnen Zeile mit Kontextmanager unterdrücken, verfügbar in Python 3.4 behandelt werden:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Wenn Sie also in bestimmten Ausnahmefällen pass möchten, verwenden Sie suppress.

261
Aaron Hall

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

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

Wobei e die Ausnahmeinstanz ist.

54
schurlix

From Python-Dokumentation -> 8.3 Ausnahmen behandeln :

Eine try -Anweisung kann mehr als eine except-Klausel enthalten, um Handler für verschiedene Ausnahmen anzugeben. Es wird höchstens ein Handler ausgeführt. Handler behandeln nur Ausnahmen, die in der entsprechenden try-Klausel auftreten, nicht in anderen Handlern derselben try-Anweisung. In einer Ausnahmeklausel können mehrere Ausnahmen als Tupel in Klammern angegeben werden. Beispiel:

except (RuntimeError, TypeError, NameError):
    pass

Beachten Sie, dass die Klammern um dieses Tupel erforderlich sind, da außer ValueError, e: die Syntax verwendet wurde, die normalerweise als except ValueError as e: in modernem Python (unten beschrieben) geschrieben wird. Die alte Syntax wird aus Gründen der Abwärtskompatibilität weiterhin unterstützt. Dies bedeutet, dass except RuntimeError, TypeError nicht except (RuntimeError, TypeError): entspricht, sondern except RuntimeError asTypeError:. Dies ist nicht das, was Sie wollen.

41
fedorqui

Wenn Sie häufig eine große Anzahl von Ausnahmen verwenden, können Sie ein Tupel vordefinieren, sodass Sie diese 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

NOTES:

  1. Wenn Sie auch andere Ausnahmen als die im vordefinierten Tupel abfangen müssen, müssen Sie einen anderen Ausnahmeblock definieren.

  2. Wenn Sie eine globale Variable einfach nicht tolerieren können, definieren Sie sie in main () und übergeben Sie sie, wo nötig ...

28
whitebeard

Ein Weg, 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 vom except -Block ausgeführt wird, und sie über den gesamten except -Block aufzurufen, den Sie schreiben.

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 Weg nicht der beste ist, aber ich zeige nur eine Reihe von Wegen, um dieses Ding zu machen.

10
M.Usman

In der Python 2.7-Dokumentation heißt es:

Eine try-Anweisung kann mehrere except-Klauseln enthalten, um Handler für verschiedene Ausnahmen anzugeben. Es wird höchstens ein Handler ausgeführt. Handler behandeln nur Ausnahmen, die in der entsprechenden try-Klausel auftreten, nicht in anderen Handlern derselben try-Anweisung. In einer Ausnahmeklausel können mehrere Ausnahmen als Tupel in Klammern angegeben werden. Beispiel:

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

Beachten Sie, dass die Klammern um dieses Tupel erforderlich sind, da mit Ausnahme von ValueError e: die Syntax für das verwendet wurde, was normalerweise mit Ausnahme von ValueError als e: in modernem Python (unten beschrieben) geschrieben wird. Die alte Syntax wird aus Gründen der Abwärtskompatibilität weiterhin unterstützt. Dies bedeutet, dass TypeError mit Ausnahme von RuntimeError nicht mit except (RuntimeError, TypeError) äquivalent ist, sondern mit Ausnahme von RuntimeError als TypeError: Das ist nicht das, was Sie wollen.

7
anand tripathi