Technologieführer

Häufige Python‑Fehler und wie du sie behebst

7 min read Python Aktualisiert 16 Sep 2025
Häufige Python‑Fehler und wie du sie behebst
Häufige Python‑Fehler und wie du sie behebst

Python-Logo vor verschwommenem Python-Code-Hintergrund, mit dem Wort 'Python' in Gelb darunter.

Python ist eine einfache Sprache — dennoch wirst du oft auf Ausnahmen stoßen. Manche sind sofort offensichtlich. Andere erfordern systematisches Nachdenken. Dieser Artikel liefert nicht nur Übersetzungen und Erklärungen der Fehlertypen, sondern auch Praktiken, Werkzeuge und Checklisten, damit du aus einem Fehler schnell eine Lektion machst.

Kurzer Überblick der behandelten Fehler

  • 5 Einrückungsfehler (IndentationError)
  • 4 Syntaxfehler (SyntaxError)
  • 3 Indexfehler (IndexError)
  • 2 Wertfehler (ValueError)
  • 1 Attributfehler (AttributeError)

Wichtig: Python meldet meist die erste Stelle, an der die Ausführung scheitert. Lies die Tracebacks von unten nach oben: die erste Ausnahme ist oft die Ursache, die darüber liegenden Zeilen sind Konsequenzen.


5 Einrückungsfehler

Einrückungsfehler entstehen, wenn die Einrückung nicht den Regeln für Blockstrukturen entspricht. In Python definieren Einrückungen Blöcke (z. B. in for, if, def). Alle Anweisungen innerhalb eines Blocks müssen auf derselben Einrückungsebene stehen.

Typische Ursachen:

  • Copy & Paste aus verschiedenen Editoren (Tabs vs. Spaces).
  • Vermisster oder überflüssiger Einzug nach einer Kopfzeile (for, if, def usw.).
  • Mischung von Tabs und Leerzeichen.

Beispiel (fehlerhaft):

for i in range(5):  
print(i)  

Beispiel für einen IndentationError in Python.

Dieser Code wirft IndentationError. Lösung: Einheitliche Einrückung innerhalb des Blocks.

for i in range(5):  
    print(i)  

Praktische Tipps:

  • Konfiguriere deinen Editor so, dass er automatisch Spaces (4) einfügt oder Tabs konsistent verwendet.
  • Aktiviere sichtbare Whitespaces, um Tabs vs. Spaces zu sehen.
  • Verwende Autoformatierer wie black oder Linter wie flake8.

Wann einfache Korrekturen nicht helfen:

  • Wenn ein Datei-Transfer von Windows/Unix Line‑Ending‑Probleme erzeugt.
  • Wenn Mischungen aus nicht‑druckbaren Unicode‑Leerzeichen involviert sind.

Schnelle Heuristik: Wenn die Fehlermeldung eine Zahl als Spalte angibt, gehe zu dieser Spalte, aktiviere Whitespaces und vergleiche Einrückungen.


4 Syntaxfehler

Ein SyntaxError tritt auf, wenn der Python‑Interpreter Code nicht parsen kann. Er verhindert, dass dein Programm überhaupt gestartet wird.

Häufige Ursachen:

  • Fehlender Doppelpunkt nach if, for, def, class.
  • Vertippte Keywords (esle statt else).
  • Unpassende Verwendung von Operatoren (= statt ==).
  • Nicht geschlossene Klammern oder Anführungszeichen.

Beispiel für einen SyntaxError in Python.

Was der Interpreter liefert:

  • Zeilennummer und oft eine Markierung, wo er das Problem erkennt.
  • Manchmal gibt die Markierung nur den Punkt an, an dem der Parser gescheitert ist — die tatsächliche Ursache kann früher liegen.

Fehlerbehebungsschritte:

  1. Lies die angegebene Zeile und die davorliegenden Zeilen.
  2. Prüfe auf fehlende oder überzählige Klammern/Quotes.
  3. Schau, ob alle Blöcke korrekt mit : beginnen.
  4. Lass einen Linter laufen, der häufige Stil‑ und Syntaxprobleme aufdeckt.

Alternative Ansätze:

  • Kurzer Test: Kopiere die problematische Funktion in eine neue Datei und führe nur diese Datei aus — so isolierst du den Fehler.
  • Nutze interaktive Shell (REPL) oder python -m py_compile datei.py zur schnellen Lokalisierung.

3 Indexfehler

Ein IndexError entsteht, wenn du versuchst, ein Element außerhalb des gültigen Bereichs einer Sequenz zuzugreifen. In Python beginnt die Indexierung bei 0. Für N Elemente gibt es Indizes 0 bis N‑1.

Beispiel:

numbers = [1, 2, 3]
print(numbers[1]) # prints 2

Wenn du numbers[3] fragst, erhältst du IndexError.

Beispiel für einen IndexError in Python.

Häufige Fehlerquellen:

  • Off‑by‑one beim Schleifenende.
  • Verändern einer Liste während der Iteration (z. B. del/pop während for i in range(len(list))).
  • Annahmen über Mindestlänge einer Sequenz ohne Validierung.

Vorbeugung:

  • Verwende for item in sequence: statt for i in range(len(sequence)): wenn möglich.
  • Prüfe if index < len(sequence): bevor du zugreifst.
  • Nutze enumerate() um Index und Wert sicher zu handhaben.

Codebeispiel mit Sicherheitscheck:

if index < len(my_list):
    # execute code

Wann es schwierig wird:

  • Bei nebenläufiger Modifikation (Threads, async) ändern sich Längen während der Laufzeit.
  • Bei verschachtelten Datenstrukturen mit ungleichmäßig gefüllten Ebenen.

2 Wertfehler

ValueError wird ausgelöst, wenn ein Objekt den richtigen Typ hat, aber einen ungeeigneten Wert für die Operation.

Beispiele:

int('10')   # OK -> 10
int('ten')  # ValueError

Beispiel für einen ValueError in Python.

Weitere Fälle:

import math
math.sqrt(-5)  # math domain error -> ValueError je nach Implementierung

Ursachen:

  • Konvertierung falscher String‑Formate.
  • Funktionen, die nur bestimmte Werte akzeptieren (z. B. kein negativer Wert).
  • Unerwartete Nutzereingaben.

Best Practices:

  • Validierung vor Konvertierung (str.isdigit(), Regex, Range‑Checks).
  • Verwende try/except ValueError bei unsicheren Eingaben.

Beispiel für robusten Umgang mit Nutzereingaben:

try:
    num = input("Gib eine ganze Zahl ein: ")
    num_int = int(num)
except ValueError as e:
    print(f"Ungültige Eingabe: {e}")

Hinweis: Bei Bibliotheken prüfe die Dokumentation, welche Werte erwartet werden.


1 Attributfehler

AttributeError tritt auf, wenn ein Objekt die angeforderte Eigenschaft oder Methode nicht besitzt. Kurz: Du forderst etwas, das das Objekt nicht bereitstellt.

Beispiele:

text = "hello world"
print(text.push())

Strings haben keine push()‑Methode. Ein weiteres Beispiel:

user = None
print(user.name)

Beispiel für einen AttributeError in Python.

Diagnosehilfen:

  • Prüfe mit type(obj) oder isinstance(obj, Klasse) den Typ.
  • Verwende dir(obj) um vorhandene Attribute und Methoden zu listen.
  • Überlege, ob du None statt einer Instanz erwartest — füge Guard‑Checks ein.

Gängige Fixes:

  • Initialisiere Objekte korrekt.
  • Verwende getattr(obj, 'attr', default) wenn ein Fallback sinnvoll ist.
  • Validiere externe Daten vor Attributzugriff.

Beispiel für sicheren Zugriff:

if user is not None:
    print(user.name)
else:
    print("Kein Benutzer vorhanden")

Debugging‑SOP (Schritt‑für‑Schritt‑Playbook)

  1. Lese die gesamte Fehlermeldung (Traceback) von unten nach oben. Identifiziere die ursprüngliche Ausnahme.
  2. Öffne die angegebene Datei und Zeile. Prüfe die umliegenden Zeilen (±3).
  3. Isoliere den Fehler in eine kleine Datei oder REPL‑Session.
  4. Füge Log‑Ausgaben (print/logging) vor/nach der Verdächtigen Stelle hinzu.
  5. Verifiziere Typen mit type() / isinstance() und valide Werte mit len() / is None / in.
  6. Teste mit kontrollierten Eingaben; schreibe einen kleinen Unit‑Test.
  7. Wenn unklar: frage einen Kollegen oder benutze einen Linter/Formatter.

Wichtig: Schreibe nach dem Fix einen kleinen Test, damit der Fehler nicht erneut eingeschleust wird.


Rolle‑basierte Checkliste

Für Einsteiger:

  • Nutze einen Editor mit Python‑Support.
  • Aktiviere Whitespace‑Anzeige.
  • Lerne print() und type() als erste Diagnosewerkzeuge.

Für erfahrene Entwickler:

  • Setze black, flake8 und CI‑Checks ein.
  • Schreibe Unit‑Tests für Grenzfälle.
  • Reviewe Codestellen auf Annahmen über Eingabewerte und Nebenläufigkeit.

Für Reviewer/Tech‑Leads:

  • Überprüfe Fehlergrenzen und Validierungen.
  • Achte auf defensive Programmierung für externe Eingaben.
  • Fordere Tests bei jedem fixierter Fehler.

Heuristiken und mentale Modelle

  • Traceback = Startpunkt, nicht immer die exakte Ursache. Lies nach oben.
  • „Ist das Objekt, das ich anspreche, wirklich das, was ich denke?“ — erinnere dich an isinstance.
  • „Gilt die Nullbasis (0) hier?“ — bei Indexproblemen immer die Länge prüfen.
  • Verwende kleine, isolierte Beispiele, um Annahmen zu prüfen.

Merkmale, Alternativen und Gegenbeispiele

  • IndentationError vs. SyntaxError: Einrückungsfehler ist oft auch ein SyntaxFehler, aber der Interpreter unterscheidet explizit die unpassende Einrückung.
  • IndexError vs. KeyError: Bei Listen/Sequenzen ist es IndexError, bei Dictionaries KeyError.
  • ValueError kann auch durch Bibliotheks‑APIs ausgelöst werden; lies die API‑Dokumentation, bevor du Annahmen triffst.

Entscheidungshilfe (Debugging‑Flowchart)

flowchart TD
  A[Fehlermeldung lesen] --> B{Ist es ein SyntaxError?}
  B -- Ja --> C[Prüfe fehlende Klammern/Quotes und Doppelpunkte]
  B -- Nein --> D{Traceback enthält Dateiposition?}
  D -- Ja --> E[Gehe zur Zeile; isolieren]
  D -- Nein --> F[Nutze Logging; reproduziere minimalen Fall]
  E --> G{Name der Ausnahme}
  G --> |IndentationError| H[Whitespaces anzeigen; Tabs/Spaces prüfen]
  G --> |IndexError| I[Index < len'' prüfen; enumerate nutzen]
  G --> |ValueError| J[Input validieren; try/except einbauen]
  G --> |AttributeError| K[type'' und dir'' prüfen; None-Guards]
  G --> |sonstige| L[Dokumentation & Stackoverflow durchsuchen]

Testfälle / Akzeptanzkriterien

  • Unit‑Test für IndentationError: Automatisierte Formatprüfung (black) in CI verhindert Regression.
  • Unit‑Test für IndexError: Tests decken Randfälle (leere Liste, Länge 1, letztes Element) ab.
  • Verhaltenstest für ValueError: Funktionen validieren Eingaben und geben klar definierte Fehlermeldungen zurück.
  • Integrationstest für AttributeError: API‑Responses auf None prüfen, bevor Attribute genutzt werden.

Kurze Glossar‑Zeile

  • IndentationError: Einrückung entspricht nicht der Blockstruktur.
  • SyntaxError: Code verletzt die Grammatik von Python.
  • IndexError: Zugriff außerhalb gültiger Indizes einer Sequenz.
  • ValueError: Ungültiger Wert, obwohl Typ korrekt ist.
  • AttributeError: Objekt hat das angeforderte Attribut nicht.
  • Traceback: Auflistung der Aufrufkette bis zur Ausnahme.

Kurze Checkliste vor dem Commit

  • Sind alle Whitespaces konsistent? (editorconfig, black)
  • Gibt es Unit‑Tests für Grenzfälle? (Längen, None, Typen)
  • Hat der Code defensive Guards für externe Eingaben?
  • Läuft der Linter ohne Fehler?

Zusammenfassung

  • Lies Tracebacks sorgfältig: sie zeigen die Ausführungsstruktur.
  • Validierung ist deine erste Verteidigungslinie gegen ValueError und IndexError.
  • AttributeError vermeidest du durch Typ‑ und None‑Checks.
  • IndentationError ist meist ein Editorproblem — setze Formatter ein.
  • Automatisiere Linting und Tests, damit häufige Fehler früh erkannt werden.

Kernaussagen:

  • Verwende Tools (Editor, Formatter, Linter) zur Prävention.
  • Isoliere Fehler in kleinen Beispielen.
  • Schreibe Tests für Randfälle, nicht nur für Happy‑Path.

Viel Erfolg beim Debuggen — jeder Fehler ist eine Chance, deinen Code robuster zu machen.

Autor
Redaktion

Ähnliche Materialien

Zoom-Meetings ohne Erlaubnis aufzeichnen
Anleitungen

Zoom-Meetings ohne Erlaubnis aufzeichnen

Mehrere Hintergrundbilder pro Android‑Startbildschirm
Android Anleitung

Mehrere Hintergrundbilder pro Android‑Startbildschirm

Apache Tomcat Monitoring: Counter & Ereignisregeln
Monitoring

Apache Tomcat Monitoring: Counter & Ereignisregeln

Clickjacking: erkennen und verhindern
Sicherheit

Clickjacking: erkennen und verhindern

Mehrere Android‑Hintergründe pro Homescreen einrichten
How-to

Mehrere Android‑Hintergründe pro Homescreen einrichten

Datenbroker entfernen: Anleitung & Dienste
Datenschutz

Datenbroker entfernen: Anleitung & Dienste