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

46voto

Wie kann man Ausnahmen richtig ignorieren?

Es gibt mehrere Möglichkeiten, dies zu tun.

Die Wahl des Beispiels hat jedoch eine einfache Lösung, die den allgemeinen Fall nicht abdeckt.

Speziell für dieses Beispiel:

Anstelle von

try:
    shutil.rmtree(path)
except:
    pass

Tun Sie dies:

shutil.rmtree(path, ignore_errors=True)

Dies ist ein spezifisches Argument für shutil.rmtree . Sie können die Hilfe dazu sehen, indem Sie folgendes tun, und Sie werden sehen, dass es auch Funktionen für Fehler zulassen kann.

>>> import shutil
>>> help(shutil.rmtree)

Da dies nur den engen Fall des Beispiels abdeckt, werde ich weiter zeigen, wie man damit umgeht, wenn diese Schlüsselwortargumente nicht existieren.

Allgemeiner Ansatz

Da die obigen Ausführungen nur den engen Fall des Beispiels abdecken, zeige ich weiter auf, wie man damit umgeht, wenn es diese Schlüsselwortargumente nicht gibt.

Neu in Python 3.4:

Sie können die suppress Kontext-Manager:

from contextlib import suppress

Aber unterdrücken Sie nur die spezifischste Ausnahme:

with suppress(FileNotFoundError):
    shutil.rmtree(path)

Sie ignorieren stillschweigend eine FileNotFoundError :

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

Von der docs :

Wie bei jedem anderen Mechanismus, der Ausnahmen vollständig unterdrückt, sollte dieser Kontextmanager nur für sehr spezielle Fehler verwendet werden bei denen die stillschweigende Fortsetzung der Programmausführung bekanntlich die das Richtige zu tun ist.

なお suppress y FileNotFoundError sind nur in Python 3 verfügbar.

Wenn Sie möchten, dass Ihr Code auch in Python 2 funktioniert, lesen Sie den nächsten Abschnitt:

Python 2 und 3:

Wenn Sie nur ein try/except ausführen möchten, ohne die Ausnahme zu behandeln, wie macht man das in Python?

Ist die folgende Vorgehensweise die richtige?

try :
    shutil.rmtree ( path )
except :
    pass

Für Python 2 kompatiblen Code, pass ist der richtige Weg, um eine Anweisung zu haben, die ein No-op ist. Aber wenn Sie eine bloße except: Das ist dasselbe, als wenn man except BaseException: die Folgendes umfassen GeneratorExit , KeyboardInterrupt y SystemExit und im Allgemeinen will man sich diese Dinge nicht einfangen.

Vielmehr sollten Sie die Ausnahme so genau wie möglich benennen.

Hier ist ein Teil der Python (2) Ausnahmehierarchie Wenn Sie allgemeinere Ausnahmen abfangen, können Sie Probleme verbergen, die Sie nicht erwartet haben:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
... and so on

Wahrscheinlich wollen Sie hier einen OSError abfangen, und vielleicht ist die Ausnahme, die Sie nicht interessiert, wenn es kein Verzeichnis gibt.

Wir können que spezifische Fehlernummer aus der errno Bibliothek, und erhöhen, wenn wir die nicht haben:

import errno

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno == errno.ENOENT: # no such file or directory
        pass
    else: # we had an OSError we didn't expect, so reraise it
        raise 

Beachten Sie, dass eine bloße Erhöhung die ursprüngliche Ausnahme auslöst, was Sie in diesem Fall wahrscheinlich wollen. Prägnanter geschrieben, da wir nicht wirklich explizit pass mit Code in der Ausnahmebehandlung:

try:
    shutil.rmtree(path)
except OSError as error:
    if error.errno != errno.ENOENT: # no such file or directory
        raise

14voto

citynorman Punkte 4182

Ich musste Fehler in mehreren Befehlen ignorieren und Scheiß drauf hat den Zweck erfüllt

import fuckit

@fuckit
def helper():
    print('before')
    1/0
    print('after1')
    1/0
    print('after2')

helper()

5 Stimmen

+1, weil Du mir definitiv den Tag versüßt hast, denn in diesem Quellcode kann man einige sehr nützliche Dinge lernen, wie z.B. das Ändern des Live-Stacks

11voto

MrChrisRodriguez Punkte 473
try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

Zu Ihrer Information: Die else-Klausel kann auf alle Ausnahmen folgen und wird nur ausgeführt, wenn der Code in der try-Klausel keine Ausnahme verursacht.

2 Stimmen

Endlich eine gute Erklärung von else in diesem Zusammenhang. Und um das hinzuzufügen finally wird immer nach jeder (oder keiner) Ausnahme laufen.

11voto

Wenn Sie nur ein Try-Catch ausführen wollen, ohne die Ausnahme zu behandeln, wie macht man das in Python?

Dies wird Ihnen helfen, zu drucken, was die Ausnahme ist:( d.h. versuchen Sie catch ohne Behandlung der Ausnahme und drucken Sie die Ausnahme.)

import sys
try:
    doSomething()
except:
    print "Unexpected error:", sys.exc_info()[0]

5voto

In Python behandeln wir Ausnahmen ähnlich wie in anderen Sprachen, aber der Unterschied liegt zum Beispiel in der unterschiedlichen Syntax,

try:
    #Your code in which exception can occur
except <here we can put in a particular exception name>:
    # We can call that exception here also, like ZeroDivisionError()
    # now your code
# We can put in a finally block also
finally:
    # Your code...

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