Zum Inhalt springen
BetaEN
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 (self vergessen, falsche Rechnung)
  • Mit assert und f"{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")

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

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")