Wie machen Sie es in Python, wenn Sie nur einen Versuch ausführen möchten, ohne die Ausnahme zu behandeln?
Ist das Folgende der richtige Weg, um es zu tun?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Joan Venge
quelle
quelle
shutil.rmtree(path, ignore_errors=True)
. Dies gilt jedoch nicht für die meisten Funktionen.try: rob() except: run()
Antworten:
oder
Der Unterschied ist , dass die erste, wird auch fangen
KeyboardInterrupt
,SystemExit
und so wie die, die direkt aus abgeleitet sindexceptions.BaseException
, nichtexceptions.Exception
.Einzelheiten finden Sie in der Dokumentation:
try
Aussagequelle
try: shuti.rmtree(...) except: pass
wird grob alle Fehler unterdrücken (auch wenn Sie falsch schreiben,shutil
was zu a führtNameError
) - zumindest tunexcept OSError:
Es ist im Allgemeinen am besten Praxis nur dann in Betracht , die Fehler fangen Sie interessiert sind im Falle von.
shutil.rmtree
Es ist wahrscheinlichOSError
:Wenn Sie diesen Fehler stillschweigend ignorieren möchten, gehen Sie wie folgt vor:
Warum? Angenommen, Sie übergeben der Funktion (irgendwie) versehentlich eine Ganzzahl anstelle einer Zeichenfolge, wie z.
Es wird der Fehler "TypeError: Erzwingen zu Unicode: Benötige Zeichenfolge oder Puffer, int gefunden" geben - Sie möchten das wahrscheinlich nicht ignorieren, was schwierig zu debuggen sein kann.
Wenn Sie definitiv alle Fehler ignorieren möchten, fangen Sie
Exception
eher als eine bloßeexcept:
Aussage. Wieder warum?Wenn Sie keine Ausnahme angeben, werden alle Ausnahmen abgefangen , einschließlich der
SystemExit
Ausnahme, die beispielsweisesys.exit()
Folgendes verwendet:Vergleichen Sie dies mit dem folgenden, das korrekt beendet wird:
Wenn Sie immer besser verhaltenen Code schreiben möchten, kann die
OSError
Ausnahme verschiedene Fehler darstellen. Im obigen Beispiel möchten wir sie jedoch nur ignorierenErrno 2
, sodass wir noch spezifischer sein können:quelle
shutil.rmtree
ist nicht das beste Beispiel, weil Sie nurignore_errors=True
für diese Funktion verwenden würden ..Es hängt davon ab, was Sie unter "Handhabung" verstehen.
Wenn Sie es abfangen möchten, ohne etwas zu unternehmen, funktioniert der von Ihnen veröffentlichte Code.
Wenn Sie damit meinen, dass Sie für eine Ausnahme Maßnahmen ergreifen möchten, ohne die Ausnahme daran zu hindern, den Stapel zu erhöhen, möchten Sie Folgendes:
quelle
Zuerst zitiere ich die Antwort von Jack o'Connor aus diesem Thread . Der Thread, auf den verwiesen wird, wurde geschlossen, also schreibe ich hier:
"In Python 3.4 gibt es eine neue Möglichkeit, dies zu tun:
Hier ist das Commit, das es hinzugefügt hat: http://hg.python.org/cpython/rev/406b47c64480
Und hier ist der Autor Raymond Hettinger, der über diese und alle möglichen anderen Python-Hotness spricht: https://youtu.be/OSGv2VnC0go?t=43m23s
Meine Ergänzung dazu ist das Python 2.7-Äquivalent:
Dann verwenden Sie es wie in Python 3.4:
quelle
Zur Vollständigkeit:
Beachten Sie auch, dass Sie die Ausnahme folgendermaßen erfassen können:
... und die Ausnahme wie folgt erneut auslösen:
... Beispiele aus dem Python-Tutorial .
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun.
Die Wahl des Beispiels hat jedoch eine einfache Lösung, die den allgemeinen Fall nicht abdeckt.
Spezifisch für das Beispiel:
Anstatt
Mach das:
Dies ist ein spezifisches Argument für
shutil.rmtree
. Sie können die Hilfe dazu wie folgt anzeigen, und Sie werden sehen, dass sie auch Funktionen für Fehler zulässt.Da dies nur den engen Fall des Beispiels abdeckt, werde ich weiter demonstrieren, wie damit umgegangen wird, wenn diese Schlüsselwortargumente nicht vorhanden waren.
Allgemeiner Ansatz
Da das Obige nur den engen Fall des Beispiels abdeckt, werde ich weiter demonstrieren, wie damit umgegangen wird, wenn diese Schlüsselwortargumente nicht vorhanden waren.
Neu in Python 3.4:
Sie können den
suppress
Kontextmanager importieren :Aber unterdrücken Sie nur die spezifischste Ausnahme:
Sie werden stillschweigend ignorieren
FileNotFoundError
:Aus den Dokumenten :
Beachten Sie, dass
suppress
undFileNotFoundError
nur in Python 3 verfügbar sind.Wenn Sie möchten, dass Ihr Code auch in Python 2 funktioniert, lesen Sie den nächsten Abschnitt:
Python 2 & 3:
Für Python 2-kompatiblen Code
pass
ist dies der richtige Weg, um eine Anweisung zu erhalten, die kein Op ist. Aber wenn man mit einem nackten tunexcept:
, das ist die gleiche wie zu tun ,except BaseException:
was beinhaltetGeneratorExit
,KeyboardInterrupt
undSystemExit
, und im Allgemeinen, Sie wollen nicht , diese Dinge zu fangen.Tatsächlich sollten Sie die Ausnahme so genau wie möglich benennen.
Hier ist ein Teil der Python (2) -Ausnahmehierarchie . Wie Sie sehen, können Sie Probleme verbergen, die Sie nicht erwartet haben, wenn Sie allgemeinere Ausnahmen abfangen:
Sie möchten hier wahrscheinlich einen OSError abfangen, und vielleicht ist die Ausnahme, die Sie nicht interessiert, wenn kein Verzeichnis vorhanden ist.
Wir können diese spezifische Fehlernummer aus der
errno
Bibliothek abrufen und erneut erhöhen, wenn wir diese nicht haben:Beachten Sie, dass eine bloße Erhöhung die ursprüngliche Ausnahme auslöst, was in diesem Fall wahrscheinlich das ist, was Sie wollen. Genauer geschrieben, da wir
pass
bei der Ausnahmebehandlung nicht explizit mit Code arbeiten müssen:quelle
Dies hilft Ihnen beim Drucken der Ausnahme: (dh versuchen Sie catch, ohne die Ausnahme zu behandeln, und drucken Sie die Ausnahme.)
quelle
Zu Ihrer Information, die else-Klausel kann nach allen Ausnahmen gehen und wird nur ausgeführt, wenn der Code im Versuch keine Ausnahme verursacht.
quelle
else
in diesem Zusammenhang. Und um das hinzuzufügen,finally
wird immer nach einer (oder keiner Ausnahme) ausgeführt.Ich musste Fehler in mehreren Befehlen ignorieren und fuckit hat den Trick gemacht
quelle
In Python behandeln wir Ausnahmen, die denen anderer Sprachen ähnlich sind, aber der Unterschied ist ein Syntaxunterschied, z.
quelle
Normalerweise mache ich einfach:
quelle
_ = ""
mitpass
.