edubun
Deutsch

Fehlermeldungen lesen und ein kleines Projekt

Ein Python-Traceback wird von unten gelesen: Die letzte Zeile nennt den Fehler, und die Angabe über dem Code nennt Datei und Zeilennummer.

Eine Motte, 1947 in ein Logbuch geklebt

Hintergrund1947 fanden Ingenieure, die am Computer Mark II der Harvard University arbeiteten, eine Motte, die in einem seiner Bauteile steckte. Sie klebten das Insekt in ihr Logbuch und schrieben daneben „first actual case of bug being found“. Die Seite befindet sich heute im National Museum of American History der Smithsonian. Die Beschreibung des Museums ist bei zwei beliebten Einzelheiten vorsichtig. Ingenieure nannten kleine Fehler schon lange vorher „Bugs“, und Thomas Edison nutzte das Wort in den 1870er-Jahren, die Motte hat den Begriff also nicht erfunden; der Witz funktioniert, weil das Wort schon existierte. Und Grace Hopper, die in jenem Jahr im Team der Mark II war, hat dieses Logbuch wahrscheinlich nicht geführt, obwohl sie und das Team halfen, „Bug“ und „Debug“ zu Alltagswörtern für Programmierende zu machen.

Heute sind die meisten Bugs Fehler im Code, und Python ist gut darin, dir von denen zu erzählen, die es erkennen kann. Einsteigende sehen einen roten Fehler oft als Urteil. Er ist eher ein Lieferschein: was schiefging, in welcher Zeile und in welchem Codestück. Der Trick ist zu wissen, wo man hinsehen muss.

Einen Traceback von unten nach oben lesen

total = 0
count = 0
print(total / count)
Ausgabe
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
Lies in der Reihenfolge 1, 2, 3: den Fehlertyp und die Meldung in der letzten Zeile, dann die Datei und die Zeilennummer, dann den markierten Teil des Codes.

Beginne mit der letzten Zeile. ZeroDivisionError: division by zero nennt den Fehlertyp und eine kurze Erklärung. Gehe dann hinauf zur File-Zeile: dem Dateinamen (auf deinem Computer erscheint dort der volle Ordnerpfad; hier ist er zu main.py gekürzt) und der Zeilennummer, 3. Die Zeile darunter ist der Code selbst, und Python 3.12 markiert die genaue fehlgeschlagene Operation mit ^ unter dem /-Zeichen. Erst nachdem du alle drei gelesen hast, solltest du anfangen, etwas zu ändern. Passiert der Fehler in einer Funktion, listet der Traceback jeden Aufruf auf dem Weg dorthin auf, und die unterste File-Zeile ist meist die, auf die man zuerst sehen sollte.

FehlerÜbliche UrsacheBeispiel
SyntaxErrorDie Zeile ist kein gültiger Python-Code: Eine Klammer, ein Doppelpunkt oder ein Anführungszeichen fehlt.print("hi"
IndentationErrorFehlende oder ungleichmäßige Einrückungif x > 1: ohne eingerückte Zeile
NameErrorEin Name, den es noch nicht gibt, oft ein Tippfehlerpritn("hi")
TypeErrorEine Operation mit dem falschen Typ"Age: " + 15
ValueErrorRichtiger Typ, unmöglicher Wertint("abc")
IndexErrorIndex hinter dem Ende einer Liste oder eines Strings[1, 2][2]
KeyErrorSchlüssel nicht im Dictionary{"a": 1}["b"]
ZeroDivisionErrorDivision durch null5 / 0

Ein SyntaxError ist anders als die übrigen. Python findet ihn, bevor etwas läuft, also läuft nicht einmal Zeile 1, und es gibt keinen „Traceback“-Kopf. Alle anderen passieren, während das Programm läuft, nachdem die früheren Zeilen ihre Arbeit schon getan haben. Erwartest du einen bestimmten Fehler, kannst du ihn mit try und except abfangen, was das Tutorial in seinem Kapitel über Fehler behandelt: Python probiert den eingerückten Block, und passiert dieser Fehler, führt es stattdessen den except-Block aus, statt zu stoppen.

print("before")
n = int("abc")
print("after")
Ausgabe
before
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    n = int("abc")
        ^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'
text = "abc"
try:
    n = int(text)
except ValueError:
    n = 0
print(n)
Ausgabe
0

Die schwersten Bugs geben gar keine Meldung. Bei einem Logikfehler läuft das Programm, gibt aber die falsche Antwort aus, wie das Bewertungsprogramm aus der Einheit zu if, das 85 ein C gab. Python kann nicht wissen, was du gemeint hast. Gehe dafür zurück zur Ablauftabelle oder füge vorübergehende print-Zeilen hinzu, die die Variablen bei jedem Schritt zeigen, und entferne sie, sobald der Bug gefunden ist.

Kleines Projekt: ein Taschengeld-Protokoll

Das Projekt nutzt etwas aus fast jeder Einheit: ein Dictionary für Ausgaben, eine Funktion, die eine Summe zurückgibt, eine for-Schleife, einen f-String und ein if. Tippe es ab, führe es aus und mache es dann zu deinem: Ändere die Posten, füge eine Kategorie hinzu oder warne, wenn ein einzelner Posten mehr als die Hälfte des Taschengelds kostet.

def total(spent):
    t = 0
    for amount in spent.values():
        t += amount
    return t

allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
    print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
    print("Less than half left")
Ausgabe
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

Schreibe vor dem Ändern eine Ablauftabelle für used und left und sage voraus, was passiert, wenn du einen Posten von 6000 Won hinzufügst. Baue dann absichtlich Fehler ein: Lösche den Doppelpunkt hinter der def-Zeile, tippe spent einmal falsch und dividiere used durch null. Lies jeden Traceback von unten, bevor du ihn behebst. Ein Programm kaputt machen und wieder reparieren zu können ist die eigentliche Fähigkeit, die dieser Kurs aufgebaut hat.

TracebackPythons Fehlerbericht; du liest ihn von unten nach oben
SyntaxErrorUngültiger Code, der gefunden wird, bevor etwas läuft
NameErrorEin Name, den es nicht gibt, oft ein Tippfehler
TypeErrorEine Operation mit einem Wert des falschen Typs
ValueErrorDer richtige Typ mit einem unmöglichen Wert, etwa int("abc")
LogikfehlerLäuft ohne Meldung, gibt aber die falsche Antwort
try / exceptFührt den except-Block aus, statt zu stoppen, wenn dieser Fehler passiert
  1. Welche Zeile eines Tracebacks nennt die Art des Fehlers?
    • Die erste Zeile
    • Die File-Zeile
    • Die letzte Zeile
    • Die Zeile mit den ^-Markierungen
  2. Welchen Fehler verursacht int("12a")?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. Welchen Fehler verursacht pritn("hi")?
    • SyntaxError
    • NameError
    • TypeError
    • Keinen Fehler
  4. Ein Programm gibt Zeile 1 aus und stoppt dann mit einem Fehler in Zeile 2. Welche Art von Fehler kann nicht die Ursache sein?
    • SyntaxError
    • NameError
    • TypeError
    • ZeroDivisionError
  5. Was gibt das aus?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. Was passiert beim Ausführen?
    print("start")
    print(5 / 0)
    print("end")
    • Es gibt start und end aus
    • Es gibt start aus und stoppt dann mit ZeroDivisionError
    • Es stoppt mit ZeroDivisionError, bevor etwas ausgegeben wird
    • Es gibt start, inf und end aus
  7. Ein Programm läuft ohne jede Meldung, gibt aber die falsche Summe aus. Was für ein Fehler ist das?
    • SyntaxError
    • Logikfehler
    • NameError
    • IndentationError
  8. Was gibt das aus?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. Bringe die Zeilen dieses kleinen Programms in die richtige Reihenfolge, damit es das Ergebnis unten ausgibt.
    Ausgabe
    80.0
  10. Wo ist der Bug? def avg(nums): return sum(nums) / len(nums), aufgerufen mit avg([]).
    • sum einer leeren Liste ist ein Fehler
    • len([]) ist 0, es wird also durch null geteilt
    • return kann keine Division enthalten
    • Es gibt keinen Bug
Häufige Fehler
  • „Der Fehler liegt in der Zeile, die die Meldung nennt, dort gehört also die Korrektur hin.“ Oft, aber nicht immer. In der Einheit zu Funktionen stoppt x = show_area(4, 3), gefolgt von x * 2, mit einem TypeError in der Zeile x * 2, doch der eigentliche Fehler ist das print in show_area, das ein return hätte sein sollen. Lies die genannte Zeile und frage dann, woher ihre Werte kamen.
  • „Alles in try/except zu packen behebt Fehler.“ Es versteckt sie nur. Fange einen bestimmten Fehler ab, den du erwartest, etwa ValueError bei int(input()), und behandle ihn sinnvoll.
  • „Keine Fehlermeldung heißt, das Programm ist richtig.“ Logikfehler laufen stumm. Teste mit Eingaben, deren Antwort du schon kennst, auch mit Randfällen wie einer leeren Liste oder einem Grenzalter.
Hinweis für LehrkräfteMache Fehlermeldungen alltäglich. Eine gute Routine: Bevor etwas behoben wird, liest die Lernende die letzte Zeile laut vor, nennt dann die Zeilennummer und zeigt auf die ^-Markierungen. Absichtlich kaputte Programme (ein SyntaxError, ein NameError, ein TypeError) sind ein schnelles Aufwärmen. Der koreanische Informatiklehrplan der Mittelstufe verlangt, Ergebnisse mit einem Debugger zu analysieren und Fehler zu korrigieren; IDLE hat einen einfachen im Menü Debug, doch print-Zeilen und Ablauftabellen leisten auf diesem Niveau dasselbe. Das Taschengeld-Projekt passt zum nächsten Standard, ein Problem des wirklichen Lebens mit einem Programm zu lösen, und lässt sich an ein Snack-Budget der Klasse oder ein Lesetagebuch anpassen.
Das Wichtigste
  • Lies einen Traceback von unten: Fehlertyp, dann Datei und Zeile, dann der markierte Code.
  • Ein SyntaxError stoppt das Programm, bevor Zeile 1 läuft; andere Fehler stoppen es unterwegs.
  • try/except behandelt einen Fehler, den du erwartest.
  • Logikfehler geben keine Meldung: verfolgen und mit bekannten Antworten testen.
  • Fehlersuche heißt, absichtlich kaputt zu machen und zu reparieren, bis Meldungen alltäglich wirken.
Quellen zu diesem Kurs (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Abgerufen: 2026-10-19