python - without - Wie ignoriere ich Exceptions?




try except python exceptions (7)

Wie ignoriere ich Exceptions?

Es gibt mehrere 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 von

try:
    shutil.rmtree(path)
except:
    pass

Mach das:

shutil.rmtree(path, ignore_errors=True)

Dies ist ein speziell für shutil.rmtree spezifisches shutil.rmtree . Sie können die Hilfe darauf sehen, indem Sie Folgendes tun, und Sie werden sehen, dass es auch bei Fehlern Fehler verursachen kann.

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

Da dies nur den schmalen Fall des Beispiels abdeckt, werde ich weiter zeigen, wie dies zu handhaben ist, wenn diese Schlüsselwortargumente nicht existieren.

Allgemeiner Ansatz

Da das obige nur den schmalen Fall des Beispiels abdeckt, werde ich weiter zeigen, wie dies zu handhaben ist, wenn diese Schlüsselwortargumente nicht existieren.

Neu in Python 3.4:

Sie können den suppress importieren:

from contextlib import suppress

Unterdrücken Sie jedoch nur die spezifischste Ausnahme:

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

Sie ignorieren FileNotFoundError einen FileNotFoundError :

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

Aus den docs :

Wie bei jedem anderen Mechanismus, der Ausnahmen vollständig unterdrückt, sollte dieser Kontextmanager nur verwendet werden, um sehr spezifische Fehler zu behandeln, bei denen es bekannt ist, dass das unbeaufsichtigte Fortsetzen der Programmausführung die richtige Vorgehensweise ist.

Beachten Sie, dass suppress und FileNotFoundError 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:

Wenn Sie nur versuchen / ausnehmen wollen, ohne die Ausnahme zu behandeln, wie machen Sie das in Python?

Ist das Folgende der richtige Weg?

try :
    shutil.rmtree ( path )
except :
    pass

Für Python 2-kompatiblen Code ist pass der richtige Weg, um eine Anweisung zu erhalten, die ein No-Op ist. Aber wenn Sie ein blank except: tun, das ist das gleiche wie except BaseException: tun except BaseException: die GeneratorExit , KeyboardInterrupt und SystemExit , und im Allgemeinen wollen Sie diese Dinge nicht abfangen.

In der Tat sollten Sie bei der Benennung der Ausnahme so genau sein wie Sie können.

Hier ist ein Teil der Python (2) -Ausnahmehierarchie , und wie Sie sehen können, können Sie bei allgemeineren Ausnahmen Probleme verstecken, 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 möchten Sie hier einen OSError abfangen, und vielleicht ist die Ausnahme, die Sie nicht interessieren, wenn es kein Verzeichnis gibt.

Wir können diese spezifische Fehlernummer aus der errno Bibliothek holen und reraised, wenn wir das 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 in diesem Fall wahrscheinlich der Fall ist. Genauer formuliert, da wir bei der Ausnahmebehandlung nicht explizit Code übergeben müssen:

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

Wenn Sie nur versuchen wollen - außer, ohne die Ausnahme zu behandeln, wie machen Sie das in Python?

Ist das Folgende der richtige Weg?

try:
    shutil.rmtree(path)
except:
    pass

Wenn Sie nur versuchen wollen, ohne die Ausnahme zu behandeln, wie machen Sie das in Python?

Es hängt davon ab, was Sie unter "Handhabung" verstehen.

Wenn Sie es abfangen möchten, ohne etwas zu unternehmen, funktioniert der von Ihnen gepostete Code.

Wenn Sie meinen, dass Sie eine Aktion für eine Ausnahme ausführen möchten, ohne die Ausnahme vom Hochfahren des Stapels zu stoppen, dann möchten Sie Folgendes:

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown

Es wird allgemein als Best-Practice angesehen, nur die Fehler zu finden, die Sie interessieren. Im Fall von shutil.rmtree es 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 möchten, tun Sie Folgendes:

try:
    shutil.rmtree(path)
except OSError:
    pass

Warum? Sagen Sie, dass Sie (irgendwie) die Funktion versehentlich eine Ganzzahl anstelle einer Zeichenfolge übergeben, wie:

shutil.rmtree(2)

Es wird der Fehler "TypeError: Coercing zu Unicode: brauchen Zeichenfolge oder Puffer, int gefunden" - Sie wahrscheinlich nicht ignorieren möchten, die schwer zu debuggen sein kann.

Wenn Sie alle Fehler auf jeden Fall ignorieren möchten, fangen Sie Exception statt einer bloßen except: Anweisung. Nochmal warum?

SystemExit Ausnahme SystemExit jede Ausnahme SystemExit , einschließlich der SystemExit Ausnahme, die beispielsweise sys.exit() verwendet:

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

Vergleichen Sie dies mit dem Folgenden, das korrekt beendet:

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

Wenn Sie immer besseren Code schreiben möchten, kann die OSError Ausnahme verschiedene Fehler darstellen, aber im obigen Beispiel wollen wir nur Errno 2 ignorieren, so dass wir noch spezifischer werden könnten:

try:
    shutil.rmtree(path)
except OSError, e:
    if e.errno == 2:
        # suppress "No such file or directory" error
        pass
    else:
        # reraise the exception, as it's an unexpected error
        raise

Sie könnten auch import errno und das if ändern, if e.errno == errno.ENOENT:


In Python behandeln wir Ausnahmen ähnlich wie andere Sprachen, aber der Unterschied ist zum Beispiel

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

Zur Vollständigkeit:

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print "division by zero!"
...     else:
...         print "result is", result
...     finally:
...         print "executing finally clause"

... aus dem Python-Tutorial .

Beachten Sie auch, dass Sie die Ausnahme wie folgt erfassen können:

>>> try:
...     this_fails()
... except ZeroDivisionError as detail:
...     print 'Handling run-time error:', detail

Eine Ausnahme in Python behandeln: Wenn Sie verdächtigen Code haben, der eine Ausnahme auslösen kann, können Sie Ihr Programm verteidigen, indem Sie den verdächtigen Code in einen try: block setzen.

try:
    # your statements .............
except ExceptionI:
    # your statments.............
except ExceptionII:
    # your statments..............
else:
   # your statments





try-except