Über den Fang eine Ausnahme
Wie kann ich schreiben Sie eine try
/except
- block fängt alle Ausnahmen?
- Weil ich weiß wirklich nicht, was die exception zu fangen, und auch der code ist in einer high-level-wrapper.
- In den meisten Fällen werden Sie, wahrscheinlich, tun etwas falsch, wenn Sie versuchen zu fangen-ohne Ausnahme. Ich meine, man kann einfach etwas falsch in deinem code, und Sie werden auch nicht wissen. Es ist eine gute Praxis, zu fangen spezifische Ausnahmen.
- Um genauer zu sein, fangen alles mögliche Ausnahmen ist nur dann ein problem, wenn Sie erwischt werden, schweigend. Es ist schwer zu denken, wo andere diese Vorgehensweise ist angemessen, andere als dort, wo die Gefangenen Fehlermeldungen gedruckt zu
sys.stderr
und ggf. protokolliert. Das ist eine durchaus gültige und gängige Ausnahme.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie, aber Sie sollte wohl nicht:
Diese wird jedoch fangen auch Ausnahmen wie
KeyboardInterrupt
und Sie in der Regel nicht wollen, tun Sie? Es sei denn, Sie re-raise Ausnahme sofort - siehe das folgende Beispiel von den docs:except Exception:
die Nackte außer Sie haben es fangen auch die BaseException lieben.except Exception:
.except
tun die gleiche Sache wieexcept Exception:
und verweisen auf die Ausnahme mitsys.exc_info()[0]
. Ich bin kein Python-Kerl, so jemand brauchen, um dies zu bestätigen.Abgesehen von einem nackten
except:
- Klausel (die, wie andere schon sagten, sollten Sie nicht verwenden), können Sie einfach fangenAusnahme
:Normalerweise würden Sie nur jemals in Betracht ziehen, tun dies auf der äußersten Ebene des Codes, wenn Sie zum Beispiel wollte, Griff sonst nicht abgefangene Ausnahmen, vor dem beenden.
Den Vorteil
except Exception
auf die Nackteexcept
ist, dass es gibt ein paar Ausnahmen, die es nicht zu fangen, die meisten offensichtlichKeyboardInterrupt
undSystemExit
: wenn Sie gefangen und verschluckt die dann Sie könnten machen es schwer für jeden, zu beenden Ihr Skript.Exception
. Beachten Sie, dass es unmöglich ist, um eineint
als eine Ausnahme, und der Versuch, so zu tun, wirftTypeError
Ausnahme, das ist das, was sein würde, gefangen von der umgebendenexcept Exception
Klausel in einem solchen Fall. Auf der anderen Seite, ein old-style-Klasse ausgelöst werden können, und gilt als ein "nicht-Ausnahme", die nicht UnterklasseException
- diese werden gefangen werden, durch eine bloßeexcept
Klausel aber nicht durch eineexcept Exception
- Klausel.TypeError
Können Sie dies tun, behandeln Allgemeine Ausnahmen
Sehr einfaches Beispiel, ähnlich dem hier:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Wenn man versucht, ALLE Ausnahmen abfangen, dann setzen Sie alle Ihre code innerhalb des "try:" Anweisung, anstelle von " drucken ", der eine Aktion Durchführt, die möglicherweise eine Ausnahme."'.
In dem oben genannten Beispiel, würden Sie sehen, die Ausgabe in dieser Reihenfolge:
1), der eine Aktion Durchführt, die möglicherweise eine Ausnahme.
2) Schließlich wird aufgerufen, unmittelbar nach der Ausführung des try-Anweisung, ob eine exception geworfen wird oder nicht.
3) "Eine exception wurde geworfen!" oder "Alles sieht toll aus!", je nachdem, ob eine Ausnahme geworfen wurde.
Hoffe, das hilft!
Fangen alle möglichen Ausnahmen, fangen
BaseException
. Es ist auf der Oberseite der Exception-Hierarchie:Python 3:
https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7:
https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
Aber wie andere Menschen erwähnt, sollten Sie in der Regel nicht, es sei denn, Sie haben einen sehr guten Grund.
KeyboardInterrupt
denke ichIch habe gerade herausgefunden, dass dieser kleine trick, zu testen, ob Ausnahme-Namen in Python 2.7 . Manchmal habe ich behandelt mit spezifischen Ausnahmen in den code, also brauchte ich ein test, um zu sehen, ob das der name ist in einer Liste von behandelten Ausnahmen.
Gibt es mehrere Möglichkeiten, dies zu tun, insbesondere mit Python 3.0 und höher
Ansatz 1
Dieser einfache Ansatz aber nicht empfohlen, weil Sie nicht genau wissen würde, welche Zeile der code ist eigentlich das werfen der Ausnahme:
Ansatz 2
Dieser Ansatz wird empfohlen, da es bietet mehr Details über jede Ausnahme. Es beinhaltet:
Der einzige Nachteil ist, tracback importiert werden muss.
Es ist erwähnenswert, das ist nicht die richtige Python-Codierung. Diese fangen auch viele Fehler, die Sie vielleicht nicht wollen, zu fangen.