Wenn Sie nur ein try-except ohne Behandlung der Ausnahme tun wollen, wie tun Sie es in Python?
Ist die folgende Vorgehensweise die richtige?
try:
shutil.rmtree(path)
except:
pass
Wenn Sie nur ein try-except ohne Behandlung der Ausnahme tun wollen, wie tun Sie es in Python?
Ist die folgende Vorgehensweise die richtige?
try:
shutil.rmtree(path)
except:
pass
Beachten Sie, dass StopIteration und Warning ebenfalls von Exception erben. Je nach Ihren Bedürfnissen sollten Sie stattdessen von StandardError erben.
Das ist richtig, aber wenn Sie nicht aufpassen, können Sie auf subtile Fehler stoßen (vor allem, wenn Sie etwas anderes tun, als StopIteration weiterzugeben).
-1, try: shuti.rmtree(...) except: pass
unterdrückt grob alle Fehler (auch wenn Sie sich vertippen shutil
was zu einer NameError
) - zumindest tun except OSError:
Es gilt allgemein als beste Praxis, nur die Fehler zu erfassen, die Sie interessieren. Im Fall von shutil.rmtree
es ist wahrscheinlich OSError
:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
Wenn Sie diesen Fehler ignorieren wollen, können Sie das tun:
try:
shutil.rmtree(path)
except OSError:
pass
Und warum? Angenommen, Sie übergeben der Funktion (irgendwie) versehentlich eine ganze Zahl anstelle einer Zeichenkette, z. B:
shutil.rmtree(2)
Es wird die folgende Fehlermeldung ausgegeben "TypeError: Zwangsweise Umstellung auf Unicode: benötigt String oder Puffer, int gefunden" - Sie sollten das nicht ignorieren, denn es kann schwierig sein, Fehler zu finden.
Wenn Sie definitiv alle Fehler ignorieren wollen, fangen Exception
als eine bloße except:
Aussage. Nochmals: Warum?
Die Nichtangabe einer Ausnahme fängt jede Ausnahme, einschließlich der SystemExit
Ausnahme, die zum Beispiel sys.exit()
verwendet:
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
Vergleichen Sie dies mit dem folgenden Beispiel, das korrekt beendet wird:
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
Wenn Sie immer besser funktionierenden Code schreiben wollen, ist die OSError
Ausnahme kann verschiedene Fehler darstellen, aber in dem obigen Beispiel wollen wir nur ignorieren Errno 2
damit wir noch konkreter werden können:
import errno
try:
shutil.rmtree(path)
except OSError as e:
if e.errno != errno.ENOENT:
# ignore "No such file or directory", but re-raise other errors
raise
shutil.rmtree
ist nicht das beste Beispiel, denn Sie würden einfach ignore_errors=True
für diese Funktion..
Diese Antwort gefällt mir sehr, aber Sie haben nicht erklärt, wie Sie von Errno 2
a errno.ENOENT
.. Könnte für viele Leute hilfreich sein. ;) Siehe Python Standard Errno System Symbols für weitere Informationen.
Zunächst zitiere ich die Antwort von Jack o'Connor aus dieses Thema . Der referenzierte Thread wurde geschlossen, also schreibe ich hier:
"In Python 3.4 wird es eine neue Methode geben, dies zu tun:
from contextlib import suppress
with suppress(Exception):
# your code
Hier ist der Commit, der 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-Themen spricht: https://youtu.be/OSGv2VnC0go?t=43m23s
Meine Ergänzung dazu ist das Äquivalent zu Python 2.7:
from contextlib import contextmanager
@contextmanager
def ignored(*exceptions):
try:
yield
except exceptions:
pass
Dann verwenden Sie es wie in Python 3.4:
with ignored(Exception):
# your code
Wenn Sie nur ein Try-Catch ohne Behandlung der Ausnahme tun wollen, wie tun Sie es in Python?
Das hängt davon ab, was Sie unter "Handhabung" verstehen.
Wenn Sie es abfangen wollen, ohne etwas zu unternehmen, funktioniert der von Ihnen angegebene Code.
Wenn Sie meinen, dass Sie auf eine Ausnahme reagieren wollen, ohne zu verhindern, dass die Ausnahme auf dem Stapel nach oben wandert, dann brauchen Sie etwas wie dieses:
try:
do_something()
except:
handle_exception()
raise #re-raise the exact same exception that was thrown
Der Vollständigkeit halber:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
Beachten Sie auch, dass Sie die Ausnahme wie folgt erfassen können:
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print("Handling run-time error:", err)
...und erhöhe die Ausnahme wie folgt:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
Außerdem können mehrere Ausnahmetypen als eingeklammertes Tupel behandelt werden:
try:
i_might_fail()
except (ValueError, TypeError) as ex:
print('I failed with: ', ex)
...oder als separate Ausnahmeklauseln:
try:
i_might_fail()
except ValueError:
print('handling a ValueError...')
except TypeError:
print('handling a TypeError...')
...siehe die python einführung .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
17 Stimmen
Seltsam, dass es bis jetzt niemand erwähnt hat (ich habe es in meiner Antwort getan), aber für diese spezielle Funktion können Sie einfach Folgendes tun
shutil.rmtree(path, ignore_errors=True)
. Dies gilt jedoch nicht für die meisten Funktionen.11 Stimmen
Wichtig zu lesen, wenn man über das Ignorieren von Ausnahmen nachdenkt: Warum ist "except: pass" eine schlechte Programmierpraxis?
6 Stimmen
Stellen Sie sich vor, dies im wirklichen Leben zu tun. try: get_cash('$1000') except: pass # meh, es wird wahrscheinlich gut sein