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?
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.
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
.
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.
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.
suppress
KontextmanagerDie 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
.
Für python 2.5 und frühere Versionen lautet die korrekte Syntax:
except (IDontLikeYouException, YouAreBeingMeanException), e:
print e
Wobei e
die Ausnahmeinstanz ist.
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 alsexcept 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, dassexcept RuntimeError, TypeError
nichtexcept (RuntimeError, TypeError):
entspricht, sondernexcept RuntimeError as
TypeError:
. Dies ist nicht das, was Sie wollen.
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:
Wenn Sie auch andere Ausnahmen als die im vordefinierten Tupel abfangen müssen, müssen Sie einen anderen Ausnahmeblock definieren.
Wenn Sie eine globale Variable einfach nicht tolerieren können, definieren Sie sie in main () und übergeben Sie sie, wo nötig ...
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.
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.