950 Stimmen

Wie man Ausnahmen richtig ignoriert

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

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

1217voto

vartec Punkte 124396
try:
    doSomething()
except: 
    pass

o

try:
    doSomething()
except Exception: 
    pass

Der Unterschied besteht darin, dass die erste Variante auch die KeyboardInterrupt , SystemExit und dergleichen, die sich direkt von exceptions.BaseException pas exceptions.Exception .

Siehe Dokumentation für Details:

5 Stimmen

Beachten Sie, dass StopIteration und Warning ebenfalls von Exception erben. Je nach Ihren Bedürfnissen sollten Sie stattdessen von StandardError erben.

1 Stimmen

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).

18 Stimmen

-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:

165voto

dbr Punkte 158949

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

3 Stimmen

shutil.rmtree ist nicht das beste Beispiel, denn Sie würden einfach ignore_errors=True für diese Funktion..

1 Stimmen

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.

122voto

Jabba Punkte 17616

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

0 Stimmen

Das ist schön. Noch besser, es auf diese Weise zu tun \n sp=suppress(Exception) \n mit sp: \n # Ihr Code

118voto

Jason Baker Punkte 180981

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

60voto

cbare Punkte 11327

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.com

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.

Powered by:

X