Zum Hauptinhalt springen

Bugs 🪲

Beim Programmieren passieren Fehler. Programmfehler nennt man auch Bugs.

Es gibt zwei Arten von Programmfehlern:

Syntaxfehler
Das Programm ist für den Computer unverständlich und nicht ausführbar.
Problem: Wir sagen es falsch.
Lösung: Fehlermeldung genau analysieren.
Logikfehler (Semantikfehler)
Das Programm ist für den Computer verständlich und wird ausgeführt, macht aber nicht das, was es soll.
Problem: Wir sagen das Falsche.
Lösung: Code genau analysieren (hier gibt es keine Fehlermeldung).

Syntax Fehler SyntaxError

Sie haben bereits festgestellt, dass Python sehr pingelig ist was Tippfehler und die präzise Verwendung von Klammern, Anführungszeichen, Doppelpunkten und Leerzeichen angeht. Jede Sprache hat seine eigenen Regeln, wie Wörter und Sätze strukturiert sein müssen. Diese Regeln sind allgemein bekannt als die Syntax einer Sprache.

Syntax
Bei Programmiersprachen wird mit der Syntax festgelegt, welche Wörter, in welcher Reihenfolge und in welchem Kontext erlaubt sind.

Syntax Fehler sind kleine Fehler in einem Programm. Da das Programm nicht von einem Menschen, sondern von einem Computer "gelesen" und interpretiert wird, reicht ein Tippfehler, ein fehlendes Komma oder eine fehlende Klammer, dass das Programm vom Computer nicht mehr verstanden werden kann.

Die Python Sprache setzt sich aus folgenden Elementen zusammen:

Schlüsselwörter
oder Statements
Wörter oder Zeichen, die ohne Anführungszeichen und ohne Klammern geschrieben werden.
z.B. import, from oder for, aber auch : oder *.
Sie müssen in einer vordefinierten Reihenfolge vorliegen, damit diese von Python verstanden werden. (👉 alle Schlüsselwörter)
Befehle
oder Unterprogramme, Funktionen
vordefinierte Befehle, die mit einer runden Klammer aufgerufen werden.
z.B. print('hello')
Variablen
Namen, die einen Wert enthalten
Häufigste Ursachen
  • Fehler bei Schlüsselwörtern
  • vergessene oder falsch eingesetzte Feldtrenner (z.B. :)
  • Falsche Anordnung von Schlüsselwörtern/Feldtrennern

Beispiele

frm turtle import *
forward(100)
from turtle import *
goto(100 50)
from turtle import *
for i in range(4)
forward(25)
right(90)
Fehler finden

Untersuchen Sie obenstehende Programmschnipsel. Was sagen Ihnen die Fehlermeldungen?

  • Auf welcher Zeile der Fehlermeldung steht die Art des Fehlers?
    Laden...
  • Wo in der Fehlermeldung finden Sie Hinweise auf den Fehler? Flicken Sie sie...
frm turtle import *
forward(100)
from turtle import *
goto(100 50)

Hinweis

Was macht der Befehl goto? Schauen Sie die Funktionsweise unter 👉 Turtle Befehle#goto(x, y) nach

from turtle import *
for i in range(4)
forward(25)
right(90)
Laden...

Namens Fehler NameError

Tippfehler beim Aufrufen von Unterprogrammen oder bei der Verwendung von Variablen führen oft zu einem Namens-Fehler (NameError). Es wird also versucht, ein Unterprogramm zu öffnen (oder eine Variable abzufragen), das aber unter diesem Namen nicht gefunden werden kann.

Häufigste Ursachen

Die häufigste Ursachen von NameErrors sind

  • Vertipper im Namen des Befehls
  • nicht importierte Befehle (z.B. from turtle import * fehlt)

Beispiele

from turtle import *
forwrd(100)

Der angegebene Befehl forwrd kann nicht gefunden werden, da er weder in einer importierten Bibliothek, noch im aktuellen Programm gefunden werden kann.

Der gleiche Fehler tritt auf, wenn der Befehl zwar richtig geschrieben wird, das Importieren aber vergessen geht:

forward(100)
Fehler finden

Finden und lösen Sie die entstandenen Fehler. Flicken Sie alle Fehler, indem Sie die Fehlermeldungen analysieren.

warnung

Die verwendeten Befehle haben wir bisher nicht angeschaut. Dennoch können die Fehler durch die Fehlermeldungen gefunden und behoben werden.

from math import *

print('15.3 gerundet =', rond(15.3))
print('15.8 gerundet =', round(15.8))
print('15.3 aufgerundet =', ceyl(15.3))
print('15.8 abgerundet =', flor(15.8))

Nachdem das Programm nun geflickt ist... was machen die Befehle?

Laden...
Laden...

Einrückungsfehler IndentationError

Python erwartet nach jedem Doppelpunkt :, dass ein eingerückter Codeblock kommt. Falls kein eingerückter Codeblock gefunden wird, entsteht ein IndentationError. Wird jedoch fälschlicherweise eine Zeile eingerückt, so wird ebenfalls dieser Fehler angezeigt.

Häufigste Ursachen
  • Die nächste Zeile nach einem Doppelunkt : ist nicht eingerückt
  • Eine Zeile ist fälschlicherweise eingerückt
  • ein Leerschlag zu wenig eingerückt
Einrücken mit der Tabulator-Taste

Am einfachsten kann Code mit der Tabulator-Taste eingerückt werden. Es kann auch ein Code-Block markiert und mit eingerückt werden.

Beispiel

Nicht eingerückt
for i in range(5):
print('Hallo')
Korrektur
for i in range(5):
print('Hallo')
Falsch eingerückt
print('Hallo')
print('wie')
print('gehts?')
Korrektur
print('Hallo')
print('wie')
print('gehts?')
Fehler finden

Finden und lösen Sie die entstandenen Fehler, so dass die Ausgabe

Hallo zum 0
Hallo zum 1
Ende

lautet. Das Programm muss also immer wieder ausgeführt-, die Fehlermeldungen analysiert und Codeteile korrigiert werden.

for i in range(2):
print('Hallo zum', i)
print('Ende')
Laden...

Typfehler TypeError

Typfehler entstehen, wenn ein Befehl mit einem falschen Datentyp aufgerufen wird. Die meisten Python Befehle erwarten einen bestimmten Datentyp als Argument. Zum Beispiel erwartet der Befehl forward eine ganze Zahl vom Typ int. Wird ein falscher Datentyp übergeben, so kann der Befehl nicht ausgeführt werden und es entsteht ein TypeError.

Error 1

Beim Ausführen eines Programms stossen Sie auf folgende Fehlermeldung:

Was könnte hier das Problem sein?

Tipps
  • Um welchen Turtle-Befehl handelt es sich hier wohl?
  • Welche Datentypen haben Sie bereits kennengelernt?

Halten Sie Ihre Vermutung hier fest:

Laden...
Laden...
Error 2

Auch in diesem Programm hat sich wieder ein Bug eingeschlichen. Eigentlich sollte hier die UK-Flagge gezeichnet werden, aber das Programm lässt sich momentan nicht ausführen.

Starten Sie das Programm, analysieren Sie die Fehlermeldung und beheben Sie den Fehler. Das Programm sollte danach mindestens ausführbar sein.

Dokumentation

Die korrekte Verwendung aller Turtle-Befehle ist im 👉 Cheatsheet dokumentiert.

from turtle import *

speed(0)
bgcolor('#012169')

penup()
goto(-300, 150)
pendown()
color('white')
pensize(30)
goto(300, -150)

penup()
goto(-300, -150)
pendown()
goto(300, 150)

penup()
goto(-300, 150)
pendown()
color('#C8102E')
pensize(10)
goto(300, -150)

penup()
goto(-300, -150)
pendown()
goto(300, 150)

penup()
goto(0, 150, 0)
pendown()
color('white')
pensize(50)
right(90)
forward(300)

penup()
goto(-300, 0)
pendown()
left(90)
forward(600)

penup()
goto(0, 150)
pendown()
color('#C8102E')
pensize(30)
right(90)
forward(300)

penup()
goto(-300, 0)
pendown()
left(90)
forward(600)

hideturtle()
done()
Laden...

Logikfehler

Aus der Sicht von Python funktioniert alles und das Programm kann ausgeführt werden 👍🥳.

Sobald aber das Programm ausgeführt wird, macht es nicht das, was Sie sich gewünscht haben - dann spricht man von Logik-Fehlern 💩...

Diese Fehler sind im allgemeinen am schwierigsten zu finden. Ein häufiger Fehler ist aber, dass man bei einem Befehl die runden Klammern am Ende vergisst - für Python kein Problem, da es den Befehl kennt, jedoch nicht dazu aufgefordert wird, diesen auszuführen. (Der Befehl wird also nicht aufgerufen.)

Häufigste Ursachen

Checkliste für Logikfehler

  • sind bei Befehlen die runden Klammern () am Ende angegeben?
  • bis zu welchem Punkt funktioniert das Programm? (Fehler eingrenzen)
  • ...

Beispiel

from turtle import *
penup()
goto(-10, 10)
pendown
for i in range(4):
forward(20)
left(90)

Auf Zeile 4 fehlen die runden Klammern - pendown wird nicht ausgeführt! Fehler beheben: Den Befehl mit pendown() aufrufen.


Fehler finden

Finden und beheben Sie alle Fehler, so dass folgende Ausgabe entsteht:

Iteratives Vorgehen

Ein iteratives Vorgehen ist hier unumgänglich. Überprüfen Sie nach jeder Korrektur, ob Sie den aktuellen Fehler beheben konnten, oder ob noch weitere Fehler vorliegen.

from turtle import *

fillcolor("Rot")
penup()
goto(-125 125)
begin_fill()
for i in range(4)
forward(250)
left(90)
end_fill()
forward(150)
links(90)
forward(50)
fillcolor("white")
begin_fill()
for i in range(4):
forward(50)
right(90)
forward(50)
left(90)
forward(50)
left(90)
end_fill
Laden...