Lektion 27 von 35Python
Python · Lektion 27 · 35 Minuten
Fehler-Detektiv 2: Klassen und Ausnahmen
Das lernst du
- Längere Fehlermeldungen (Tracebacks) Schritt für Schritt lesen
- Fehler in Klassen finden (
selfvergessen, falsche Rechnung) - Mit
assertundf"{x=}"gezielt prüfen
Lange Fehlermeldungen lesen
Je größer ein Programm, desto länger werden die Fehlermeldungen. Python zeigt dann einen Traceback: die Kette von Funktionsaufrufen, die zum Fehler geführt hat. Der wichtigste Teil bleibt die letzte Zeile:
class Tier:
def __init__(self, name):
self.name = name
def vorstellen(self):
return "Ich bin " + self.nmae
hund = Tier("Bello")
print(hund.vorstellen())AttributeError: 'Tier' object has no attribute 'nmae' – ein Tippfehler im Attributnamen. Codelix schlägt dir sogar den richtigen Namen vor.
Der Klassiker: self vergessen
class Zaehler:
def __init__(self):
stand = 0 # ← ohne self. ist das nur eine lokale Variable
def plus(self):
self.stand += 1
z = Zaehler()
z.plus()In einer Methode gehört alles, was das Objekt sich merken soll, an self. Sonst ist es nach dem Ende der Methode weg.
Werkzeug: assert und f”{x=}”
Mit assert prüfst du eine Annahme. Stimmt sie nicht, bricht Python sofort ab – genau an der Stelle, wo es zum ersten Mal falsch wird:
def netto(brutto):
return brutto / 1.19
preis = netto(119)
print(f"{preis=}") # zeigt Name UND Wert
assert round(preis) == 100, "Netto-Preis stimmt nicht"
print("Alles korrekt!")f"{preis=}" ist ein Trick für die Fehlersuche: Python schreibt den Namen gleich mit dazu.
Detektiv-Regel 2: Erkläre deinen Code laut – einem Freund, einem Kuscheltier oder einer Gummiente. Beim Erklären fällt einem der Fehler erstaunlich oft selbst auf. Profis nennen das Rubber-Duck-Debugging.
Deine Aufgabe
Jetzt bist du dran
Die Klasse Konto hat drei Bugs. Richtig wäre: Ein neues Konto startet mit guthaben 0. einzahlen(betrag) erhöht das Guthaben – negative Beträge sollen einen ValueError auslösen. abheben(betrag) verringert das Guthaben und löst einen ValueError aus, wenn nicht genug Geld da ist.
class Konto:
def __init__(self, besitzer):
self.besitzer = besitzer
guthaben = 0
def einzahlen(self, betrag):
if betrag < 0:
print("Nur positive Beträge!")
self.guthaben += betrag
def abheben(self, betrag):
if betrag > self.guthaben:
raise ValueError("Nicht genug Geld")
self.guthaben + betrag
konto = Konto("Ana")
konto.einzahlen(50)
konto.abheben(20)
print(konto.besitzer, "hat", konto.guthaben, "Euro")- Denkanstoß
In
__init__fehlt etwas vor guthaben – ohneself. ist es nur eine Variable, die sofort wieder verschwindet. - Welcher Befehl hilft?
Schau dir die letzte Zeile von abheben an. Wird das Ergebnis irgendwo gespeichert?
Eine Meldung mit
print()hält das Programm nicht auf. BenutzeraiseValueError(...)wie in abheben. - Lückencode – ergänze die ___
class Konto: def __init__(self, besitzer): self.besitzer = besitzer self.guthaben = ___ def einzahlen(self, betrag): if betrag < 0: ___ self.guthaben += betrag def abheben(self, betrag): if betrag > self.guthaben: raise ValueError("Nicht genug Geld") self.guthaben -= ___ konto = Konto("Ana") konto.einzahlen(50) konto.abheben(20) print(konto.besitzer, "hat", konto.guthaben, "Euro")
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:
class Konto:
def __init__(self, besitzer):
self.besitzer = besitzer
self.guthaben = 0
def einzahlen(self, betrag):
if betrag < 0:
raise ValueError("Nur positive Beträge!")
self.guthaben += betrag
def abheben(self, betrag):
if betrag > self.guthaben:
raise ValueError("Nicht genug Geld")
self.guthaben -= betrag
konto = Konto("Ana")
konto.einzahlen(50)
konto.abheben(20)
print(konto.besitzer, "hat", konto.guthaben, "Euro")