Direkt zum Hauptinhalt springen
eLearner.app
Modul 2 · Lektion 4 von 48/36 im Kurs~12 min
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

Python
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 des try ausgelöst wird.

Abfangen der Exception-Meldung

Verwende as, um das Exception-Objekt an einen Namen zu binden:

Python
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

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Ein Tupel von Typen fängt jede Exception dieser Typen (oder Unterklassen) ab.

Die vollständige Struktur: try / except / else / finally

Python
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 exception
  • else — verwende dies für Code, der vom Erfolg des try abhä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:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Die 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 der try-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

Übung#python.m2.l4.e1
Versuche: 0Wird geladen…

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`.

Editor wird geladen…
Hinweis anzeigen

int('abc') löst einen ValueError aus.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#python.m2.l4.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#python.m2.l4.e3
Versuche: 0Wird geladen…

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`.

Editor wird geladen…
Hinweis anzeigen

Verwende try: result = int(text_val) gefolgt von except ValueError: result = None.

Lösung nach 3 Versuchen verfügbar