Python Exception Handling meistern: try, except, else und finally erklärt
Python Exception Handling meistern: try, except, else und finally erklärt
Dieser Leitfaden führt Sie durch Pythons Exception-Handling-Konstrukte mit praktischen Code-Beispielen und Best-Practice-Tipps.
Video: Python Exception Handling (try..except..finally)
Exceptions in Python
Python löst eingebaute Exceptions aus, wann immer ein Laufzeitfehler auftritt. Der Interpreter hält den aktuellen Codeblock an und propagiert die Exception den Call Stack hinauf, bis ein Handler gefunden wird. Existiert kein Handler, terminiert das Programm und gibt einen Traceback aus.
Betrachten Sie die folgende Aufrufkette: A ruft B auf, welches C aufruft. Wenn C eine Exception auslöst, die nicht lokal behandelt wird, blubbert die Exception zu B und dann zu A hoch. Unbehandelte Exceptions führen zu einem abrupten Programmabsturz.
Exceptions in Python abfangen
Um eine Exception abzufangen, platzieren Sie den potenziell unsicheren Code in einen try-Block. Die except-Klausel enthält die Logik, die bei einer Exception ausgeführt wird.
Hier ist ein prägnantes Beispiel, das den Ablauf demonstriert:
# sys-Modul importieren, um Exception-Typ zu inspizieren
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("Der Eintrag ist", entry)
r = 1 / int(entry)
break
except:
print("Hoppla!", sys.exc_info()[0], "ist aufgetreten.")
print("Nächster Eintrag.")
print()
print("Der Kehrwert von", entry, "ist", r)
Ausgabe
Der Eintrag ist a Hoppla! <class 'ValueError'> ist aufgetreten. Nächster Eintrag. Der Eintrag ist 0 Hoppla! <class 'ZeroDivisionError'> ist aufgetreten. Nächster Eintrag. Der Eintrag ist 2 Der Kehrwert von 2 ist 0.5
Der Code iteriert über random_list. Wenn die Konvertierung zu int oder die Division fehlschlägt, behandelt der except-Block den Fehler, loggt ihn und geht zum nächsten Element über. Bei erfolgreicher Konvertierung bricht die Schleife ab und der Kehrwert wird ausgegeben.
Da alle eingebauten Exceptions von Exception erben, können Sie sie generisch abfangen:
# sys-Modul importieren, um Exception-Typ zu inspizieren
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("Der Eintrag ist", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Hoppla!", e.__class__, "ist aufgetreten.")
print("Nächster Eintrag.")
print()
print("Der Kehrwert von", entry, "ist", r)
Die Ausgabe ist identisch, aber der Handler referenziert nun die spezifische Exception-Klasse über e.__class__.
Spezifische Exceptions in Python abfangen
Das pauschale Abfangen aller Exceptions kann Bugs maskieren und das Debuggen erschweren. Stattdessen listen Sie nur die Exception-Typen auf, die Sie erwarten.
Ein try-Block kann mehrere except-Klauseln enthalten; nur die erste passende Klausel wird ausgeführt. Beispiel:
try:
# Code, der einen Fehler auslösen kann
pass
except ValueError:
# ValueError behandeln
pass
except (TypeError, ZeroDivisionError):
# TypeError oder ZeroDivisionError behandeln
pass
except Exception:
# Fallback für jede andere Exception
pass
Exceptions in Python auslösen
Neben automatischen Exceptions können Entwickler Fehler explizit mit der raise-Anweisung auslösen. Optional kann eine Nachricht übergeben werden, um den Grund zu klären.
raise KeyboardInterrupt # Traceback: KeyboardInterrupt
raise MemoryError("Dies ist ein Argument") # Traceback: MemoryError: Dies ist ein Argument
try:
a = int(input("Geben Sie eine positive Ganzzahl ein: "))
if a <= 0:
raise ValueError("Das ist keine positive Zahl!")
except ValueError as ve:
print(ve)
Python try mit else-Klausel
Die optionale else-Klausel läuft nur, wenn der try-Block ohne Exception-Abwurf abgeschlossen wird. Dieses Muster trennt Erfolgs-Pfad-Code von der Fehlerbehandlung.
Beispiel: Kehrwert einer geraden Zahl ausgeben.
# Programm zum Ausgeben des Kehrwerts gerader Zahlen
try:
num = int(input("Geben Sie eine Zahl ein: "))
assert num % 2 == 0
except:
print("Keine gerade Zahl!")
else:
kehrwert = 1 / num
print(kehrwert)
Ausgabe bei Eingabe einer ungeraden Zahl:
Geben Sie eine Zahl ein: 1 Keine gerade Zahl!
Ausgabe bei Eingabe einer geraden Zahl:
Geben Sie eine Zahl ein: 4 0.25
Beachten Sie, dass wenn num null ist, ZeroDivisionError im else-Block ausgelöst wird und nicht von der vorangehenden except-Klausel abgefangen wird.
Python try…finally
Typische Verwendung bei Datei-Handling:
try:
f = open("test.txt", encoding='utf-8')
# Dateioperationen durchführen
finally:
f.close()
Die Datei wird immer geschlossen, auch wenn während der Verarbeitung ein Fehler auftritt.
Python
- Python-Schlüsselwörter & Bezeichner: Reservierte Wörter & Benennungskonventionen meistern
- Python-Anweisungen, Einrückung & Kommentare: Klare Anleitung
- Python-Variablen, Konstanten & Literale – Umfassender Leitfaden
- Python-Typkonvertierung & Casting meistern: Umfassender Leitfaden
- Python I/O & Modul-Importe meistern: Praxisleitfaden
- Python pass-Statement meistern: Praxisleitfaden
- Python Global, Local & Nonlocal Variablen verstehen
- Verzeichnis- und Dateioperationen in Python meistern
- Python Exception Handling meistern: try, except, else und finally erklärt
- Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung