Python Exception Handling: Umfassender Leitfaden zur Fehlerbehandlung
Standardausnahmen in Python
Python bietet zwei wichtige Features zur Behandlung unerwarteter Fehler und für Debugging-Fähigkeiten:
- Exception Handling – Wird in diesem Tutorial behandelt. Hier eine Liste der Standardausnahmen.
- Assertions – Werden im Tutorial „Assertions in Python“ behandelt.
Liste der Standardausnahmen
| Nr. | Ausnahme & Beschreibung |
|---|---|
| 1 | Exception – Basisklasse für alle Ausnahmen. |
| 2 | StopIteration – Wird ausgelöst, wenn next() eines Iterators auf kein Objekt verweist. |
| 3 | SystemExit – Wird durch sys.exit() ausgelöst. |
| 4 | StandardError – Basisklasse für alle eingebauten Ausnahmen außer StopIteration und SystemExit. |
| 5 | ArithmeticError – Basisklasse für alle numerischen Berechnungsfehler. |
| 6 | OverflowError – Berechnung überschreitet das Maximum für einen numerischen Typ. |
| 7 | FloatingPointError – Gleitkomma-Berechnung fehlgeschlagen. |
| 8 | ZeroDivisionError – Division oder Modulo durch Null bei allen numerischen Typen. |
| 9 | AssertionError – Fehlschlagen der assert-Anweisung. |
| 10 | AttributeError – Fehlschlagen von Attributreferenz oder -zuweisung. |
| 11 | EOFError – Keine Eingabe von raw_input() oder input() und Dateiende erreicht. |
| 12 | ImportError – import-Anweisung fehlgeschlagen. |
| 13 | KeyboardInterrupt – Benutzer unterbricht Programm (meist Strg+C). |
| 14 | LookupError – Basisklasse für Suchfehler. |
| 15 | IndexError – Index in einer Sequenz nicht gefunden. |
| 16 | KeyError – Schlüssel nicht im Dictionary gefunden. |
| 17 | NameError – Bezeichner nicht im lokalen oder globalen Namensraum gefunden. |
| 18 | UnboundLocalError – Zugriff auf lokale Variable in Funktion, der kein Wert zugewiesen wurde. |
| 19 | EnvironmentError – Basisklasse für Ausnahmen außerhalb der Python-Umgebung. |
| 20 | IOError – Eingabe-/Ausgabeoperation fehlgeschlagen (z. B. print oder open() bei nicht existierender Datei). |
| 21 | OSError – Betriebssystembedingte Fehler. |
| 22 | SyntaxError – Fehler in der Python-Syntax. |
| 23 | IndentationError – Einrückung nicht korrekt angegeben. |
| 24 | SystemError – Internes Interpreterproblem, Interpreter beendet sich nicht. |
| 25 | SystemExit – Interpreter wird durch sys.exit() beendet. Unbehandelt führt zum Exit. |
| 26 | TypeError – Operation/ Funktion ungültig für den Datentyp. |
| 27 | ValueError – Eingebaute Funktion hat gültigen Typ, aber ungültige Werte. |
| 28 | RuntimeError – Erzeugter Fehler fällt in keine Kategorie. |
| 29 | NotImplementedError – Abstrakte Methode in erbender Klasse nicht implementiert. |
Assertions in Python
Eine Assertion ist ein Plausibilitätstest, den Sie nach Abschluss der Tests aktivieren oder deaktivieren können.
Am einfachsten stellt man sich eine Assertion als raise-if-not-Anweisung vor: Ein Ausdruck wird geprüft, und wenn er False ergibt, wird eine Ausnahme ausgelöst.
Assertions werden durch die assert-Anweisung durchgeführt, ein Schlüsselwort, das in Version 1.5 eingeführt wurde.
Programmierer platzieren Assertions oft am Funktionsanfang zur Validierung der Eingabe und nach Funktionsaufrufen zur Validierung der Ausgabe.
Die assert-Anweisung
Syntax:
assert Expression[, Arguments]
Wenn der Ausdruck False ist, löst Python eine AssertionError-Ausnahme aus. Der optionale Arguments-Wert dient als Argument für die Ausnahme. AssertionError kann wie jede andere Ausnahme mit try-except abgefangen werden; andernfalls beendet sie das Programm mit einem Traceback.
Beispiel
Funktion zur Umrechnung von Kelvin in Fahrenheit. Da 0 Kelvin der absolute Nullpunkt ist, bricht die Funktion bei negativen Temperaturen ab:
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0), "Colder than absolute zero!"
return ((Temperature - 273) * 1.8) + 32
print(KelvinToFahrenheit(273))
print(int(KelvinToFahrenheit(505.78)))
print(KelvinToFahrenheit(-5))
Ausgabe:
32.0 451 Traceback (most recent call last): File "test.py", line 9, inprint(KelvinToFahrenheit(-5)) File "test.py", line 4, in KelvinToFahrenheit assert (Temperature >= 0), "Colder than absolute zero!" AssertionError: Colder than absolute zero!
Was ist eine Exception?
Eine Exception ist ein Ereignis, das während der Programmausführung auftritt und den normalen Ablauf der Anweisungen stört. Wenn ein Python-Skript auf eine Situation stößt, die es nicht bewältigen kann, löst es eine Exception aus. Eine Exception ist ein Python-Objekt, das einen Fehler repräsentiert.
Wird eine Exception ausgelöst, muss sie entweder sofort behandelt werden, andernfalls terminiert das Skript.
Eine Exception behandeln
Verdächtigen Sie Code, der eine Exception auslösen könnte, können Sie Ihr Programm schützen, indem Sie den Code in einen try:-Block setzen. Darauf folgt eine except:-Anweisung mit einem Block, der das Problem so elegant wie möglich behandelt.
Syntax
try:
# Ihre Operationen hier
...
except ExceptionI:
# Bei ExceptionI diesen Block ausführen
except ExceptionII:
# Bei ExceptionII diesen Block ausführen
...
else:
# Wenn keine Exception, diesen Block ausführen
Wichtige Punkte
- Ein einzelner
try-Block kann mehrereexcept-Blöcke haben – nützlich bei verschiedenen Exception-Typen. - Ein generischer
except-Block fängt jede Exception ab. - Nach den
except-Klauseln kann einelse-Block folgen, der ausgeführt wird, wenntrykeine Exception auslöst. - Der
else-Block eignet sich für Code, der nicht den Schutz destry-Blocks benötigt.
Beispiel: Erfolgreiches Schreiben
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print("Error: can't find file or read data")
else:
print("Written content in the file successfully")
fh.close()
Ausgabe:
Written content in the file successfully
Beispiel: Fehlgeschlagenes Schreiben (keine Schreibberechtigung)
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print("Error: can't find file or read data")
else:
print("Written content in the file successfully")
Ausgabe:
Error: can't find file or read data
except-Klausel ohne Exception-Typ
Sie können except ohne definierte Ausnahmen verwenden:
try:
# Operationen
...
except:
# Bei beliebiger Exception diesen Block ausführen
...
else:
# Keine Exception -> diesen Block ausführen
Dies fängt alle Exceptions ab. Dies gilt jedoch als schlechte Praxis, da die Fehlerursache nicht identifiziert wird.
except-Klausel mit mehreren Exceptions
Mehrere Exceptions in einer except-Klausel behandeln:
try:
# Operationen
...
except (Exception1[, Exception2[, ... ExceptionN]]):
# Bei einer Exception aus der Liste diesen Block ausführen
...
else:
# Keine Exception -> diesen Block ausführen
Der try-finally-Block
Ein finally:-Block zusammen mit try: stellt Code bereit, der immer ausgeführt wird, egal ob eine Exception auftrat oder nicht.
try:
# Operationen
...
finally:
# Wird immer ausgeführt
...
Ein else-Block kann nicht zusammen mit finally verwendet werden.
Beispiel
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print("Error: can't find file or read data")
Ohne Schreibberechtigung ergibt sich:
Error: can't find file or read data
Sauberer geschrieben mit verschachtelten try-finally:
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print("Going to close the file")
fh.close()
except IOError:
print("Error: can't find file or read data")
Wird eine Exception im try-Block ausgelöst, geht die Ausführung sofort zum finally-Block. Nach Abarbeitung aller finally-Anweisungen wird die Exception erneut ausgelöst und in den except-Blöcken der nächsthöheren try-except-Ebene behandelt.
Argument einer Exception
Eine Exception kann ein Argument haben – ein Wert mit zusätzlichen Informationen zum Problem. Der Inhalt variiert je Exception. Sie fangen das Argument ab, indem Sie eine Variable in der except-Klausel angeben:
try:
# Operationen
...
except ExceptionType, Argument:
# Wert von Argument ausgeben...
Bei einer einzelnen Exception folgt die Variable dem Exception-Namen. Bei mehreren Exceptions folgt die Variable dem Tuple der Exceptions. Die Variable erhält den Exception-Wert (meist Ursache), als einzelnen Wert oder Tuple (Fehlerstring, Fehlernummer, Fehlerposition).
Beispiel: Einzelne Exception
#!/usr/bin/python
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print("The argument does not contain numbers\n", Argument)
temp_convert("xyz")
Ausgabe:
The argument does not contain numbers invalid literal for int() with base 10: 'xyz'
Exceptions auslösen (raise)
Sie können Exceptions mit der raise-Anweisung auslösen. Allgemeine Syntax:
raise [Exception [, args [, traceback]]]
Exception ist der Exception-Typ (z. B. NameError), argument der Wert für das Exception-Argument (optional, Standard None), traceback optional (selten verwendet).
Beispiel
def functionName(level):
if level < 1:
raise "Invalid level!", level
# Code darunter wird nicht ausgeführt, wenn Exception geworfen wird
Hinweis: Um eine Exception abzufangen, muss die except-Klausel dieselbe Exception referenzieren (Klassenobjekt oder String). Für das obige Beispiel:
try:
# Business Logic
except "Invalid level!":
# Exception handling
else:
# Rest des Codes
Benutzerdefinierte Exceptions
Python erlaubt das Erstellen eigener Exceptions durch Ableitung von den Standard-Built-in-Exceptions.
Beispiel basierend auf RuntimeError. Eine Klasse wird erstellt, die von RuntimeError erbt – nützlich für spezifischere Informationen beim Abfangen.
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Nach Definition der Klasse können Sie die Exception wie folgt auslösen:
try:
raise Networkerror("Bad hostname")
except Networkerror, e:
print(e.args)
Python
- Python-Datentypen meistern: Praxisleitfaden
- Python-Operatoren meistern: Umfassender Leitfaden
- Python pass-Statement meistern: Praxisleitfaden
- Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
- Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
- Python-Fehler & eingebaute Exceptions meistern
- Python Exception Handling meistern: try, except, else und finally erklärt
- Python benutzerdefinierte Exceptions: Ein praktischer Leitfaden
- Python Iteratoren meistern: Funktionsweise und Erstellung eigener Iteratoren
- Python Closures erklärt: Wie verschachtelte Funktionen Variablen erfassen