Lektionen des Moduls (4/4)
Fehlerbehandlung: try/except
Wenn zur Laufzeit etwas schiefgeht (eine Division durch Null, ein fehlender
Schlüssel, eine Operation auf inkompatiblen Typen), löst Python eine Exception
aus. Ohne Behandlung unterbricht die Exception das Programm. Mit try / except
kannst du sie abfangen und entscheiden, was zu tun ist.
Die Grundform
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- der
try:-Block enthält den Code, der fehlschlagen kann; - das
except <ErrorType>:wird nur ausgeführt, wenn dieser Fehlertyp innerhalb destryausgelöst wird.
Abfangen der Exception-Meldung
Verwende as, um das Exception-Objekt an einen Namen zu binden:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"Mehrere Typen zusammen
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneEin Tupel von Typen fängt jede Exception dieser Typen (oder Unterklassen) ab.
Die vollständige Struktur: try / except / else / finally
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— verwende dies für Code, der vom Erfolg destryabhängt. Halte ihn getrennt, damit du nicht versehentlich nicht damit zusammenhängende Exceptions abfängst.finally— Bereinigung, die immer stattfinden muss (Schließen einer Datei, Freigabe einer Ressource). Wird sowohl bei Erfolg als auch bei Fehlern ausgeführt.
Eine Exception auslösen: raise
Manchmal bist du derjenige, der signalisieren möchte, dass etwas schiefgelaufen ist:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bDie häufigsten integrierten Exceptions, denen du begegnen und die du auslösen wirst:
ValueError— der Wert hat den richtigen Typ, ist aber unzulässig (z.B. Parsing).TypeError— der Typ ist falsch (z.B.len(42)).KeyError/IndexError— fehlender Schlüssel/Index.ZeroDivisionError— Division durch Null.FileNotFoundError,PermissionError— Dateisystem-Operationen.
Die Klauseln else und finally in try-Blöcken
Ein try-Block kann zwei zusätzliche Klauseln definieren:
else: wird nur ausgeführt, wenn dertry-Block abgeschlossen wird, ohne dass Exceptions ausgelöst wurden.finally: wird immer ausgeführt, unabhängig davon, ob eine Exception aufgetreten ist. Dies ist ideal zum Bereinigen von Ressourcen (z.B. Schließen einer geöffneten Datei oder Datenbankverbindung).
Probiere es aus
Schreibe einen Ausdruck, der int('abc') versucht: Wenn ein ValueError ausgelöst wird, weise `result` den String 'errore' zu; andernfalls weise die Zahl zu. Evaluiere `result`.
Hinweis anzeigen
int('abc') löst einen ValueError aus.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Definiere `divide(a, b)`, das a/b zurückgibt, aber einen ValueError mit der Meldung 'divisore zero' auslöst, wenn b gleich 0 ist. Rufe dann divide(10, 0) innerhalb eines try/except-Blocks auf und weise `message` den String der abgefangenen Exception zu.
Hinweis anzeigen
raise ValueError('...') innerhalb der Funktion; fange sie mit except ValueError as e ab.
Lösung nach 3 Versuchen verfügbar
Zusätzliche Herausforderung
Schreibe einen `try-except`-Block, um den String `text_val = "abc"` in einen Integer zu konvertieren. Wenn die Konvertierung einen `ValueError` auslöst, weise `result` den Wert `None` zu. Andernfalls weise die konvertierte Zahl zu. Evaluiere schließlich `result`.
Hinweis anzeigen
Verwende try: result = int(text_val) gefolgt von except ValueError: result = None.
Lösung nach 3 Versuchen verfügbar