Wie kann ich einen try
/ except
Block schreiben , der alle Ausnahmen abfängt?
python
exception-handling
user469652
quelle
quelle
sys.stderr
und möglicherweise protokolliert werden. Das ist eine absolut gültige und häufige Ausnahme.try: whatever() except Exception as e: exp_capture()
?Antworten:
Sie können, aber Sie sollten wahrscheinlich nicht:
Dies wird jedoch auch Ausnahmen wie
KeyboardInterrupt
und das wollen Sie normalerweise nicht, oder? Es sei denn, Sie lösen die Ausnahme sofort erneut aus - siehe folgendes Beispiel aus den Dokumenten :quelle
except Exception:
das Bare, außer Sie haben dort auch die BaseException abfangen.Abgesehen von einer bloßen
except:
Klausel (die, wie andere gesagt haben, nicht verwendet werden sollte), können Sie einfach Folgendes erfassenException
:Normalerweise würden Sie dies immer nur auf der äußersten Ebene Ihres Codes in Betracht ziehen, wenn Sie beispielsweise vor dem Beenden sonst nicht erfasste Ausnahmen behandeln möchten.
Der Vorteil
except Exception
gegenüber dem Nacktenexcept
besteht darin, dass es einige Ausnahmen gibt, die es offensichtlich nicht abfängt,KeyboardInterrupt
undSystemExit
: Wenn Sie diese abfangen und verschlucken, können Sie es jedem schwer machen, Ihr Skript zu beenden.quelle
Exception
. Beachten Sie, dass es unmöglich ist,int
eine Ausnahme auszulösen, und wenn Sie dies versuchen, wird eineTypeError
Ausnahme ausgelöstexcept Exception
, die in einem solchen Fall von der beiliegenden Klausel erfasst wird. Auf der anderen Seite kann eine Klasse im alten Stil ausgelöst werden und als "Nicht-Ausnahme" qualifiziert werden, die keine Unterklasse enthältException
- dies wird durch eine bloßeexcept
Klausel, aber nicht durch eineexcept Exception
Klausel erfasst.TypeError
sys.exit()
bedeutet normalerweise, dass Sie erwarten, dass die App beendet wird, aber wenn Sie SystemExit abfangen, wird dies nicht der Fall sein. Wenn Sie in einem laufenden Skript die Strg-C-Taste drücken (Strg-Pause unter Windows), erwarten Sie ebenfalls, dass das Programm stoppt, den Fehler nicht abfängt und weitermacht. Sie können jedoch eine oder beide davon abfangen, wenn Sie eine Bereinigung durchführen möchten, bevor diese vorhanden ist.Sie können dies tun, um allgemeine Ausnahmen zu behandeln
quelle
Um alle möglichen Ausnahmen zu fangen, fangen Sie
BaseException
. Es befindet sich oben in der Ausnahmehierarchie: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 bereits erwähnt haben, benötigen Sie dies normalerweise nicht, nur für bestimmte Fälle.
quelle
Sehr einfaches Beispiel, ähnlich dem hier gefundenen:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Wenn Sie versuchen, ALLE Ausnahmen abzufangen, setzen Sie Ihren gesamten Code in die Anweisung "try:" anstelle von 'print ". Führen Sie eine Aktion aus, die möglicherweise eine Ausnahme auslöst.' '.
Im obigen Beispiel wird die Ausgabe in dieser Reihenfolge angezeigt:
1) Ausführen einer Aktion, die eine Ausnahme auslösen kann.
2) Schließlich wird direkt nach dem Ausführen der try-Anweisung aufgerufen, ob eine Ausnahme ausgelöst wird oder nicht.
3) "Eine Ausnahme wurde ausgelöst!" oder "Alles sieht gut aus!" abhängig davon, ob eine Ausnahme ausgelöst wurde.
Hoffe das hilft!
quelle
Insbesondere mit Python 3.0 und höher gibt es mehrere Möglichkeiten, dies zu tun
Ansatz 1
Dies ist ein einfacher Ansatz, der jedoch nicht empfohlen wird, da Sie nicht genau wissen, in welcher Codezeile die Ausnahme tatsächlich ausgelöst wird:
Ansatz 2
Dieser Ansatz wird empfohlen, da er detailliertere Informationen zu jeder Ausnahme enthält. Es enthält:
Der einzige Nachteil ist, dass Tracback importiert werden muss.
quelle
Ich habe gerade diesen kleinen Trick herausgefunden, um zu testen, ob Ausnahmenamen in Python 2.7 vorhanden sind. Manchmal habe ich bestimmte Ausnahmen im Code behandelt, daher brauchte ich einen Test, um festzustellen, ob dieser Name in einer Liste der behandelten Ausnahmen enthalten ist.
quelle
Es ist erwähnenswert, dass dies keine richtige Python-Codierung ist. Dadurch werden auch viele Fehler abgefangen, die Sie möglicherweise nicht abfangen möchten.
quelle