Ich weiß, dass ich tun kann:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
Ich kann das auch machen:
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 zu tun:
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 in beiden Ausnahmen folgende Maßnahmen ergriffen werden müssen say please
):
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
Meine Bemühungen, die beiden unterschiedlichen Ausnahmen zu erfassen, kommen also nicht genau zum Tragen.
Gibt es eine Möglichkeit, dies zu tun?
python
exception
exception-handling
inspectorG4dget
quelle
quelle
Antworten:
Aus der Python-Dokumentation :
Oder nur für Python 2:
Das Trennen der Ausnahme von der Variablen durch ein Komma funktioniert in Python 2.6 und 2.7 weiterhin, ist jedoch veraltet und funktioniert in Python 3 nicht. jetzt solltest du verwenden
as
.quelle
list
, und es ergab sich einTypeError
. Sieht so aus, als müssten die Fehler in einem sein,tuple
damit das Fangen wie erwartet funktioniert.except
Zeile verwenden. Es wird nur notwendigerweise in Klammern gesetzt, wenn es in derexcept
Zeile erstellt wird.2 + (x * 2)
,(x * 2)
ist sicherlich kein Tupel. Klammern sind ein allgemeines Gruppierungskonstrukt. Das definierende Merkmal eines Tupels ist, dass es ein Komma enthält - siehe Python-Dokumentation : "Beachten Sie, dass es tatsächlich das Komma ist, das ein Tupel bildet, nicht die Klammern."Mach das:
Die Klammern sind aufgrund der älteren Syntax erforderlich, bei der das Fehlerobjekt mithilfe von Kommas einem Namen zugewiesen wurde. Das
as
Schlüsselwort wird für die Zuweisung verwendet. Sie können einen beliebigen Namen für das Fehlerobjekt verwenden, icherror
persönlich bevorzuge .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 in Klammern setzen, um sich von der früheren Syntax zu unterscheiden, bei 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:
Ich gebe nur diese Ausnahmen an, um zu vermeiden, dass Fehler ausgeblendet werden. Wenn ich auf sie stoße, erwarte ich die vollständige Stapelverfolgung.
Dies ist hier dokumentiert: https://docs.python.org/tutorial/errors.html
Sie können die Ausnahme einer Variablen zuweisen (
e
ist üblich, bevorzugen jedoch möglicherweise eine ausführlichere Variable, wenn Sie eine lange Ausnahmebehandlung haben oder Ihre IDE nur größere Auswahlen hervorhebt, wie meine.) Die Instanz verfügt über ein args-Attribut. Hier ist ein Beispiel:Beachten Sie, dass in Python 3 das
err
Objekt außerhalb des Gültigkeitsbereichs liegt, wenn derexcept
Block geschlossen wird.Veraltet
Möglicherweise wird Code angezeigt, der den Fehler mit einem Komma belegt. Diese Verwendung, das einzige in Python 2.5 und früheren Versionen verfügbare Formular, ist veraltet. Wenn Sie möchten, dass Ihr Code in Python 3 vorwärtskompatibel ist, sollten Sie die Syntax aktualisieren, um das neue Formular zu verwenden:
Wenn Sie die Zuweisung von Komma-Namen 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
KontextmanagerDie akzeptierte Antwort besteht aus mindestens 4 Codezeilen:
Die
try
,except
,pass
Linien können in einer einzigen Zeile mit dem gehandhabt werden 3,4 Unterdrückungs - Kontext - Manager, in Python :Wenn Sie also
pass
bestimmte Ausnahmen haben möchten , verwenden Siesuppress
.quelle
suppress
, viel besser lesbar als nurpass
amexcept
Aus der Python-Dokumentation -> 8.3 Ausnahmen behandeln :
quelle
Wenn Sie häufig eine große Anzahl von Ausnahmen verwenden, können Sie ein Tupel vordefinieren, sodass Sie es nicht viele Male neu eingeben müssen.
ANMERKUNGEN:
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 geben Sie sie bei Bedarf weiter ...
quelle
Eine Möglichkeit, dies zu tun, ist ..
und eine andere Möglichkeit besteht darin, eine Methode zu erstellen, die die von einem
except
Block ausgeführte Aufgabe ausführt und sie über den gesamtenexcept
Block aufruft, den Sie schreiben.Ich weiß, dass der zweite nicht der beste Weg ist, dies zu tun, aber ich zeige nur eine Reihe von Möglichkeiten, dies zu tun.
quelle
except
ist jedoch normal , mehrere Klauseln zu haben, wenn Sie die Ausnahmen unterschiedlich behandeln möchten.