Abschnitt 1 · Lektion 4
Fehler lesen
Irgendwann in den nächsten Minuten gibt dein Programm etwas Rotes aus. Nicht, weil du etwas grundsätzlich falsch machst, sondern weil das zum Programmieren dazugehört wie das Verlesen zum Vorlesen. Wer seit Jahren programmiert, sieht nicht weniger Fehlermeldungen. Er liest sie nur schneller.
Beim ersten Mal sieht eine Python-Fehlermeldung aus wie eine Wand aus Englisch. Sie ist aber immer gleich aufgebaut. Wenn du den Aufbau kennst, findest du die Stelle in ein paar Sekunden.
Von unten nach oben
print("Guten Morgen")
prnt("Wie geht's?")
print("Bis später") Wenn das Beispiel läuft, steht im Terminal zuerst Guten Morgen. Die erste Zeile ist also gelaufen.
Danach kommt in Rot die Meldung. So eine Meldung heißt in Python Traceback, wörtlich
„Rückverfolgung“. Sie hat vier Teile:
- Ganz oben
Traceback (most recent call last):, eine Überschrift. Mehr als „jetzt kommt eine Fehlermeldung“ steht da nicht. - Darunter
File "/vercel/sandbox/lern/main.py", line 2, in <module>. Das ist die Fundstelle, also die Datei und die Zeile, in der es passiert ist.in <module>heißt so viel wie „in der Datei selbst“. Wichtig wird das erst, wenn du eigene Funktionen schreibst. - Dann kommt die Zeile selbst,
prnt("Wie geht's?"), und darunter ein paar Dächer^^^^. Sie zeigen genau auf das Stück, das Python nicht verstanden hat. - Und ganz unten das Wichtigste:
NameError: name 'prnt' is not defined. Did you mean: 'print'?
Die letzte Zeile liest man zuerst. Vor dem Doppelpunkt steht die Fehlerart, hier NameError, also
ein Fehler im Namen. Danach kommt die Erklärung, dass es den Namen prnt nicht gibt. Seit einigen
Jahren hängt Python sogar einen Vorschlag an und fragt, ob print gemeint war. Meistens ja.
Erst dann geht der Blick nach oben zur Fundstelle. Das ist bequem, weil du im Terminal auf die Zeile
mit File und line 2 klicken kannst. Der Editor springt dann hin und markiert sie.
Der Pfad /vercel/sandbox/lern/ ist übrigens kein Fehler. Das ist der Ordner auf der Maschine, auf
der dein Programm läuft. Auf deinem eigenen Rechner steht dort später der Ordner, in dem deine Datei
liegt.
Fehler, bei denen gar nichts läuft
print("Erste Zeile")
print("Zweite Zeile"
print("Dritte Zeile") Hier sieht das Terminal anders aus. Die Überschrift Traceback fehlt, und die Ausgabe fehlt auch.
Nicht einmal Erste Zeile steht da, obwohl die erste Zeile völlig in Ordnung ist.
Das liegt an den zwei Schritten des Interpreters aus Lektion 1.1. Bevor Python irgendetwas ausführt, liest es die ganze Datei und prüft, ob sich alles lesen lässt. Wenn dabei etwas auffällt, hört es sofort auf, noch bevor eine einzige Zeile gelaufen ist.
Diese Fehlerart heißt SyntaxError, ein Fehler im Satzbau (syntax). Hier lautet die Meldung
SyntaxError: '(' was never closed. Die runde Klammer in Zeile 2 wurde nie geschlossen, und das
Dach steht genau unter ihr.
Zwei weitere Satzbaufehler kommen am Anfang ständig vor:
SyntaxError: unterminated string literalheißt, dass ein Anführungszeichen fehlt und der Text nie aufhört.SyntaxError: invalid syntaxheißt, dass Python selbst nicht genau weiß, was los ist. Nur dass hier etwas nicht passt. Dann hilft ein Blick in die genannte Zeile und in die Zeile davor.
Fehler, die erst beim Laufen auffallen
print("Kaffee kostet")
print("Preis: " + 2.49) Im dritten Beispiel fängt der Lauf wieder an. Kaffee kostet steht da, dann bricht es ab. In der
letzten Zeile steht TypeError: can only concatenate str (not "float") to str.
Ein TypeError heißt, dass zwei Dinge nicht zusammenpassen. Hier sollen ein Text und eine Zahl
mit + aneinandergehängt werden, und das macht Python nicht. Übersetzt heißt die Meldung, dass man
an einen Text (str) nur einen Text hängen kann und keine Kommazahl (float). Die Wellenlinie ~~~
unter der Zeile zeigt, welche zwei Teile sich nicht vertragen, und das Dach ^ mittendrin zeigt auf
das +. Die Lösung kennst du schon aus Lektion 1.2. Mit einem Komma statt des Pluszeichens gibt
print beides nebeneinander aus.
Damit kennst du die drei Fehlerarten, die dir am Anfang am häufigsten begegnen. NameError heißt,
ein Name ist falsch geschrieben oder fehlt. SyntaxError heißt, der Satzbau stimmt nicht. Und
TypeError heißt, zwei Dinge passen nicht zusammen. Die ersten beiden sind fast immer Tippfehler.
Ein Fehler nach dem anderen
Python hört beim ersten Fehler auf. Wenn dein Programm drei Fehler hat, siehst du also nur einen. Der nächste kommt erst dran, wenn der erste behoben ist.
Beim ersten Mal fühlt sich das an wie ein Rückschritt. Man repariert etwas, drückt auf Prüfen, und schon steht die nächste rote Meldung da. Dabei ist es das Gegenteil. Die neue Meldung heißt, dass Python ein Stück weiter gekommen ist als vorher. Einen Fehler beheben, laufen lassen, nächster Fehler. So kommt man voran, auch wenn es sich langsam anfühlt.
Zwei Kanäle
Vielleicht ist dir aufgefallen, dass die Meldung rot ist und die normale Ausgabe nicht. Das ist mehr
als Dekoration. Ein Programm schreibt auf zwei getrennten Kanälen. Was du mit print ausgibst,
landet auf der Standardausgabe (stdout). Fehlermeldungen landen auf dem Fehlerkanal
(stderr). Im Terminal stehen beide untereinander, und der Fehlerkanal ist rot.
Daher kommt auch der Punkt „Auf dem Fehlerkanal steht nichts“, den du in fast jeder Prüfliste findest. Ein Programm, das funktioniert, hinterlässt dort nichts.
Am Ende jedes Laufs gibt es außerdem eine Kleinigkeit, die man nicht sieht. Jedes Programm
hinterlässt beim Beenden eine Zahl, den Exit-Code. 0 heißt „alles gut“, jede andere Zahl heißt
„hat nicht geklappt“. Nach einem Traceback ist es bei Python eine 1. Sehen kannst du die Zahl,
wenn du im Terminal python main.py; echo $? tippst. Das Semikolon trennt zwei Befehle, und $?
ist der Exit-Code des letzten.
Die Meldungen in diesem Kurs kommen übrigens von Python 3.14. Ältere Versionen sagen manches knapper oder anders, und manches sagen sie gar nicht. Die Dächer und Wellenlinien unter einem Fehler, der erst beim Laufen auffällt, gibt es erst seit Python 3.11, den Vorschlag „Did you mean“ bei einem Namen seit 3.10. Die letzte Zeile und die Fundstelle stehen in jeder Version da.
Zum Mitnehmen
Eine Fehlermeldung liest man von unten nach oben. Die letzte Zeile sagt, was passiert ist, die Zeilen darüber sagen, wo.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.