3.1 Abfangen von Ausnahmen
Wir würden nicht so viel über Ausnahmen sprechen, wenn wir sie nur beobachten müssten. Ausnahmen sind spezielle Objekte, mit denen dein Python-Programm arbeiten kann. Ausnahmebehandlung ist ein wichtiger Aspekt der Programmierung, der die Zuverlässigkeit und Stabilität von Programmen verbessert.
In Python werden für das Abfangen und Verarbeiten von Ausnahmen Konstrukte wie
try
, except
, else
und
finally
verwendet. Diese Konstrukte erlauben es dir, Fehler
abzufangen, die während der Programmausführung auftreten, und entsprechende
Maßnahmen zu ergreifen.
Die try-except
Konstruktion
Die try-except
Konstruktion wird verwendet, um Ausnahmen abzufangen
und zu verarbeiten. Der try
Block enthält den Code, der eine
Ausnahme auslösen kann, und der except
Block enthält den Code,
der ausgeführt wird, wenn eine Ausnahme auftritt.
Beispiel:
try:
result = 10 / 0
except ZeroDivisionError:
print("Fehler: Division durch Null.")
Wenn im Code innerhalb des try
Blocks eine ZeroDivisionError
Ausnahme auftritt, wird sie vom except
Block abgefangen und der Code
mit dem Aufruf von print()
wird ausgeführt.
Verarbeitung mehrerer Ausnahmen
Du kannst mehrere Ausnahmetypen verarbeiten, indem du sie in separaten
except
Blöcken angibst.
try:
result = int("abc")
except ZeroDivisionError:
print("Fehler: Division durch Null.")
except ValueError:
print("Fehler: Ungültiger Wert.")
Abfangen aller Ausnahmen
Wenn du alle Ausnahmen abfangen möchtest, kannst du einen except
Block
ohne Angabe eines bestimmten Ausnahmetyps verwenden. Dies wird jedoch nicht
empfohlen, da es die Fehlersuche erschweren und wichtige Fehler verbergen kann.
try:
result = 10 / 0
except:
print("Ein Fehler ist aufgetreten.")
3.2 Die else
und finally
Anweisungen
Neben den Anweisungen try
und except
gibt es noch zwei
optionale: else
und finally
. Ich erkläre sie jetzt
ein bisschen ausführlicher.
Die try-except-else
Konstruktion
Der else
Block wird verwendet, um Code auszuführen,
wenn im try
Block keine Ausnahme aufgetreten ist.
try:
result = 10 / 2
except ZeroDivisionError:
print("Fehler: Division durch Null.")
else:
print(f"Ergebnis: {result}")
Die try-except-finally
Konstruktion
Der finally
Block enthält Code, der immer ausgeführt wird,
unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht. Dies ist
nützlich, um Ressourcen freizugeben oder abschließende Operationen durchzuführen.
try:
result = 10 / 0
except ZeroDivisionError:
print("Fehler: Division durch Null.")
finally:
print("Dieser Block wird immer ausgeführt.")
Vollständiges Beispiel: try-except-else-finally
Beispiel:
try:
result = 10 / 2
except ZeroDivisionError:
print("Fehler: Division durch Null.")
else:
print(f"Ergebnis: {result}")
finally:
print("Dieser Block wird immer ausgeführt.")
3.3 Beispiel try-except-else-finally
Lass uns ein größeres reales Beispiel betrachten. Zum Beispiel versuchen wir, Daten aus einer Datei auf der Festplatte zu lesen — was könnte einfacher sein?
file = open("file.txt", "r")
content = file.read()
print(content)
Was könnte schiefgehen? Zum Beispiel alles:
- Die Datei könnte fehlen. Sie könnte versehentlich gelöscht oder nicht gespeichert worden sein, oder dein Programm läuft auf einem anderen Computer, wo sie nie vorhanden war.
- Fehler beim Lesen der Datei. Dein Programm hat keinen Zugriff darauf, weil sie sich in einem Verzeichnis befindet, das Admin-Rechte erfordert.
- Ein anderes Programm schreibt gerade in diese Datei und sie kann nicht gelesen werden — es hat exklusiven Zugriff auf die Datei.
Nicht genug? Dann vergiss nicht, dass unabhängig davon, an welchem Punkt ein Fehler bei der Arbeit mit der Datei aufgetreten ist, du sie unbedingt „schließen“ musst, damit das Betriebssystem die für die Arbeit mit dieser Datei zugewiesenen Ressourcen freigibt.
Also wird der tatsächliche Code ungefähr so aussehen:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("Fehler: Datei nicht gefunden.")
except IOError:
print("Fehler: Ein-/Ausgabefehler.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("Datei geschlossen.")
Willkommen in der realen Welt, wo du Code nicht nur für „funktionierende Szenarien“ schreiben musst, sondern auch für alle möglichen Szenarien, die schiefgehen können.
Okay, ich will dich nicht abschrecken — es ist einfacher, als es scheint. Du musst nur
verstehen, was Grenzbedingungen (corner cases
) sind und rechtzeitig die
Überprüfung standardmäßiger Fehler hinzufügen. Der Rest wird von modernen
Frameworks erledigt.
GO TO FULL VERSION