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
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)Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total / count)
~~~~~~^~~~~~~
ZeroDivisionError: division by zeroBeginne 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 Ursache | Beispiel |
|---|---|---|
| SyntaxError | Die Zeile ist kein gültiger Python-Code: Eine Klammer, ein Doppelpunkt oder ein Anführungszeichen fehlt. | print("hi" |
| IndentationError | Fehlende oder ungleichmäßige Einrückung | if x > 1: ohne eingerückte Zeile |
| NameError | Ein Name, den es noch nicht gibt, oft ein Tippfehler | pritn("hi") |
| TypeError | Eine Operation mit dem falschen Typ | "Age: " + 15 |
| ValueError | Richtiger Typ, unmöglicher Wert | int("abc") |
| IndexError | Index hinter dem Ende einer Liste oder eines Strings | [1, 2][2] |
| KeyError | Schlüssel nicht im Dictionary | {"a": 1}["b"] |
| ZeroDivisionError | Division durch null | 5 / 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")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)0Die 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")snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half leftSchreibe 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.
| Traceback | Pythons Fehlerbericht; du liest ihn von unten nach oben |
| SyntaxError | Ungültiger Code, der gefunden wird, bevor etwas läuft |
| NameError | Ein Name, den es nicht gibt, oft ein Tippfehler |
| TypeError | Eine Operation mit einem Wert des falschen Typs |
| ValueError | Der richtige Typ mit einem unmöglichen Wert, etwa int("abc") |
| Logikfehler | Läuft ohne Meldung, gibt aber die falsche Antwort |
| try / except | Führt den except-Block aus, statt zu stoppen, wenn dieser Fehler passiert |
- Welche Zeile eines Tracebacks nennt die Art des Fehlers?
- Die erste Zeile
- Die File-Zeile
- Die letzte Zeile
- Die Zeile mit den ^-Markierungen
- Welchen Fehler verursacht
int("12a")?- TypeError
- ValueError
- NameError
- SyntaxError
- Welchen Fehler verursacht
pritn("hi")?- SyntaxError
- NameError
- TypeError
- Keinen Fehler
- 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
- Was gibt das aus?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - 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
- Ein Programm läuft ohne jede Meldung, gibt aber die falsche Summe aus. Was für ein Fehler ist das?
- SyntaxError
- Logikfehler
- NameError
- IndentationError
- Was gibt das aus?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Bringe die Zeilen dieses kleinen Programms in die richtige Reihenfolge, damit es das Ergebnis unten ausgibt.Ausgabe
80.0 - 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
- „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.
- 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