1E: Fehler

Wer mehr und mehr programmiert, bei dem werden irgendwann Fehler (oder Bugs) auftreten. Das Auslösen, Verstehen und Korrigieren von Fehlern ist ein wichtiger Teil des Programmierens. Python wird - soweit möglich - alles ausführen, was gefragt ist, aber wenn es nicht möglich ist, wird es natürlich auch nicht gehen. Ist das der Fall, versucht Python zumindest noch ein paar Informationen über den Fehler zu nennen, damit du ihn korrigieren kannst.

Hier ist ein Python-Fehler:

Beispiel : Ein Syntaxfehler

In diesem ersten Beispiel haben wir die Klammern vergessen, die für print(...) erforderlich sind. Python versteht nicht, was wir zu tun versuchen.

Hier eine andere Art von Fehler:

Beispiel : Ein Laufzeitfehler

In diesem zweiten Beispiel haben wir die Variable test nicht definiert, aber genutzt. Python weiß, was wir tun wollen, aber da test nicht existiert, tritt ein Fehler auf.

Ein Syntax-Fehler tritt auf, wenn Python nicht versteht, was gemeint ist. Ein Laufzeitfehler tritt auf, wenn Python weiß, was es tun soll, aber den Befehl nicht ausführen kann.

Im Deutschen wäre ein Syntaxfehler ein Satz wie

Bitte Katze Hund Affe.

Die Grammatik in diesem Satz macht keinen Sinn. Aus der Sicht der deutschen Grammatik fehlt hier ein Verb (Aktion). Man kann nicht verstehen, was gefragt ist. Syntax bedeutet das Gleiche wie Grammatik.

Im Deutschen wäre ein Laufzeitfehler ein Satz wie

Bitte iss das Klavier.

Der Satz macht Sinn in grammatikalischer Sicht - es gibt ein Substantiv und ein Verb an der richtigen Stelle - also kann man verstehen, was gefragt ist. Allerdings wirst du Probleme haben, den Befehl auszuführen - es sei denn, du bist eine Termite. Man nennt dies einen Laufzeitfehler, da es erst auftritt, wenn das Programm gestartet ist - also während der Laufzeit.

Wir werden auch über logische Fehler reden. Das sind Fehler, die das Programm nicht zum Absturz bringen, aber das falsche Ergebnis liefern. Ein Beispiel wäre:

Bitte schließe die Hintertüre, damit keine Fliegen reinkommen.

Das wäre ein logischer Fehler, wenn die Vordertüre auch offen ist: auch, wenn der Befehl Sinn macht und du die Hintertür schließen kannst, wird das Ziel - die Fliegen draußen zu lassen - nicht erreicht, wenn sie noch durch die Vordertür reinkommen.

Typische Syntaxfehler

Hier sind weitere Beispiele von Syntaxfehlern, die in Python auftreten können. Allgemein tritt ein Fehler auf, wenn ein Sonderzeichen oder ein spezielles Symbol an einer Stelle steht, wo es nicht erwartet wird.

Beispiel : Syntaxfehler

Hier kommt der Fehler SyntaxError: invalid syntax, wobei ^ auf das Ausrufezeichen zeigt. Das Problem ist, dass ! in Python keine Bedeutung hat. Der Syntaxfehler würde verschwinden, wenn man stattdessen print("Hello, World!") benutzen würde, weil Python dann das ! als Teil des Textes mit Hello, World akzeptiert.

Ein anderer kleiner Fehler:

Beispiel : Syntaxfehler

Das Problem hier ist, dass class ein spezielles Wort in Python ist. Hätte man stattdessen course geschrieben, würde alles wunderbar funktionieren. Klicke hier um eine Liste aller speziellen Wörter (auch "Reservierte Bezeichner") zu sehen.

Wenn du Anführungszeichen oder Klammern benutzt und das/die zweite vergessen hast, wird ein Syntaxfehler auftreten:

Beispiel : Syntax Error
Zweite Anführungsstriche vergessen

In dieser Fehlermeldung steht EOL als Abkürzung für "End Of Line" (Ende der Zeile): Python erwartet ein weiteres " aber das Ende der Zeile wurde erreicht, bevor es gefunden werden konnte.

Beispiel : Syntax Error
Schließende Klammer vergessen

Genauso steht EOF für "End OFile" (Ende der Datei): Python suchte nach ) aber die Datei endet vorher.

Laufzeitfehler

Hier sind einige Laufzeitfehler. Python ist in der Lage zu verstehen, was das Programm sagt, aber gerät in Schwierigkeiten, wenn es tatsächlich die Anweisungen ausführt.

  • Verwendung einer undefinierten Variable oder Funktion. Dies kann auch passieren, wenn du Großbuchstaben unregelmäßig im Namen einer Variablen verwendest. 
    Beispiel
    Eine undefininierte Variable
  • Durch null teilen, was in der Mathematik keinen Sinn macht. (Warum? Da 0 mal egal welche Zahl immer 0 ergibt, gibt es keine Lösung für 1 = X * 0, also ist 1/0 undefiniert.)
    Beispiel
    Durch Null teilen
  • Das Verwenden von Operatoren für die falsche Art von Daten
    Beispiel
    Text und eine Zahl addieren

Du wirst noch mehr Wege entdecken, wie du Fehler produzieren kannst, wenn du mehr über Python lernst.

Was ist der technische Unterschied zwischen einem Syntaxfehler und einem Laufzeitfehler? Dieses Beispiel sollte es verdeutlichen. Schaue dir die Ausgabe beider Programme an.
Beispiel : Laufzeitfehler
Beispiel : Syntaxfehler
Das Programm mit dem Laufzeitfehler erzeugt eine Ausgabe, das Programm mit dem Syntaxfehler nicht. Das liegt daran, dass Python in 2 Schritten arbeitet:

  1. Python prüft die Syntax und analysiert die Struktur des Programms.
  2. Wenn in Schritt 1 kein Problem gefunden wurde, wird das Programm ausgeführt.

Das Programm mit dem Syntaxfehler wird also gar nicht erst ausgeführt, das Programm mit dem Laufzeitfehler jedoch schon. Es werden alle Befehle bis zum eigentlichen Fehler problemlos ausgeführt.

Logische Fehler

Dein Programm funktioniert eventuell ohne abzustürzen (kein Syntax- oder Laufzeitfehler), macht aber dennoch etwas falsch. Ein Beispiel: Du möchtest ein Programm schreiben, dass den Durchschnitt (arithmetisches Mittel) zweier Zahlen berechnet. Der Durchschnitt der Zahlen x und y ist definiert als

\displaystyle{\frac{x+y}{2}}

Warum funktioniert das folgende Programm nicht?

Beispiel
Dies berechnet nicht dem korrekten Durchschnitt.

Der Durchschnitt sollte

\displaystyle{\frac{x+y}{2}=\frac{3+4}{2}=\frac{7}{2}=3.5}

sein, aber das Programm gibt 5.0 aus! Der Fehler folgt aus Reihenfolge, in der die Operatoren in der Arithmetik abgearbeitet werden. Wenn du x + y / 2 schreibst, bedeutet das dasselbe wie x + (y / 2) = 3 + (4 / 2) = 3 + 2 = 5. Um das Problem zu beheben, sollte die dritte Zeile average = (x + y) / 2 lauten, um Python klar zu machen, dass wir \frac{x+y}{2} berechnen wollen, wo erst addiert und danach dividiert wird.

Logische Fehler treten auf, wenn du das Programm falsch entworfen hast oder dein Code nicht deinem Entwurf entspricht (wie in dem Beispiel mit average). Logische Fehler können schwierig zu finden sein - gerade bei längeren Programmen - aber mit der Zeit, wenn du besser programmieren kannst, werden auch logische Fehler seltener auftreten. Einige Tipps, wie man logische Fehler vermeidet, findest du in Lektion 6D.

Übungen

Am Ende dieser Lektion findest du drei Übungen zum debuggen (Fehlerbeseitigung). Du kannst versuchen, den Fehler vor der Ausführung zu beseitigen oder dir erst Pythons Fehlermeldung anschauen, um festzustellen, was fehlerhaft ist.

Jedes Programm enthält bereits Code. Du musst jeweils nur wenige Zeichen (Buchstaben/Symbole/Zahlen) ändern, um das Problem zu beheben. Lösungen, in denen zu viele Zeichen verändert wurden, werden verworfen! Klicke auf Code zurücksetzen, um die Ursprungsversion zurückzuerlangen.

Programmierübung : Aussummieren
Korrigiere den Syntaxfehler in diesem Programm, so dass es die Summe der Zahlen von 1 bis 10 ausgibt. Du darfst maximal ein Zeichen ändern.

Programmierübung : Hello Joe
Korrigiere den Laufzeitfehler in folgendem Programm, sodass es in der ersten Zeile Hello und in der zweiten Zeile Joe ausgibt. Du darfst maximal zwei Zeichen ändern.

Programmierübung : Shoppen gehen
Du gehst Milch und Fleisch einkaufen (englisch: "milk" bzw. "meat"), aber diese Produkte sind mit einer Steuer (englisch: tax) belegt. Du kaufst Milch im Wert von $2,00 und Fleisch im Wert von $4,00, wobei die Steuerrate 3% beträgt. Gib die Gesamtkosten deiner Lebensmittel aus (du musst das Dollarzeichen nicht mit ausgeben). Tipp

Wenn du alle Bugs zerquetscht hast, klicke unten den "Weiter mit" Button.