python
try:
zahl = int(input('Zahl: '))
ergebnis = 100 / zahl
except ValueError:
print('Das war keine Zahl')
except ZeroDivisionError:
print('Durch null geht nicht')
except (KeyError, IndexError) as fehler: # mehrere Typen, Fehlerobjekt als 'fehler'
print('Zugriffsfehler:', fehler)
else:
print('Ergebnis:', ergebnis) # nur, wenn KEIN Fehler auftrat
finally:
print('Fertig') # läuft immer, auch bei Fehlern
| Block | Wann er läuft |
|---|---|
try |
Der Code, der fehlschlagen kann. Halte ihn kurz |
except Typ |
Wenn im try genau dieser Fehlertyp (oder ein abgeleiteter) auftritt |
except Typ as e |
Wie oben, e ist das Fehlerobjekt (print(e) zeigt die Meldung) |
else |
Wenn im try kein Fehler auftrat |
finally |
Immer, zum Aufräumen (Verbindung schließen usw.) |
Fehler selbst auslösen:
python
def alter_pruefen(alter):
if alter < 0:
raise ValueError(f'Ungültiges Alter: {alter}')
return alter
Eigene Fehlerklasse:
python
class LagerFehler(Exception):
"""Fehler im Lager."""
Mit raise LagerFehler('Nicht genug Bestand') und except LagerFehler: kannst du Fehler gezielt unterscheiden.
Zwei Regeln:
- Fange nie pauschal alles mit
except:oderexcept Exception:ab, außer ganz oben im Programm zum Protokollieren. Sonst versteckst du echte Programmierfehler. - Ein
except, das nurpassenthält, verschluckt den Fehler. Wenigstensprintoderloggingnutzen.