Finden eines Defekts mittels Debugger nach Fehlermeldungen
Ziel
Ich bin in der Lage, mittels Debugger durch ein Programm zu navigieren und zielstrebig einen Programmabsturz zu analysieren und zu beheben.
Arbeitsschritte
Was soll das Programm können?
- Das Programm
grocery_list.py
soll Ihnen im Terminal 10 Gerichte anzeigen und Ihnen ermöglichen, eine Einkaufsliste für ein von Ihnen zusammengestelltes Menü zusammenzustellen. - Das Menü darf aus mehreren, auch doppelten, Gerichten bestehen.
- Zum Beispiel würde die Eingabe
0,0,4
das Menü "2xspaghetti bolognese
und 1xshrimp scampi
" auswählen. - Die Ausgabe des Programms ist eine Liste von Zutaten, die Sie für dieses Menü einkaufen müssen.
- Dabei sollen die Artikel nach Ihrer Abteilung im Supermarkt sortiert angegeben werden.
Gewünschter Output zur Eingabe 0,0,4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
Erste Sichtung der Dateien
- Laden Sie die Datei einkaufsliste.zip herunter und entpacken Sie diese.
- Das darin enthaltene Verzeichnis besteht aus drei Dateien:
recipes.json
bildet die Datengrundlage für die Rezepte undingredients.json
gibt an, wo die Zutaten im Supermarkt liegen.grocery_list.py
ist das oben beschriebene Programm.
Finden des Defekts
- 1 Führen Sie
grocery_list.py
in Ihrem Terminal aus. Geben Sie als Input0,0,1,2
ein. Die gesuchte Ausgabe ist die Fehlermeldung des Programms. - In der Fehlermeldung werden Ihnen vier Zeilen im Quellcode genannt. Lesen Sie diese Liste von unten nach oben:
- Öffnen Sie nun
grocery_list.py
in PyCharm. - Setzen Sie einen Breakpoint auf die in 2 gefundene Zeile und starten Sie den Programmlauf mit dem Debugger.
- 4 Prüfen Sie den Wert der Variable, die in 3 als Argument des Funktionsaufrufs mitgegeben wird.
- 5 Rufen Sie über die Konsole des Debuggers die in 3 gefundene Funktion auf. Geben Sie als Argument den Wert der Variable aus 4 ein. Sie werden eine Fehlermeldung erhalten. Um was für einen Fehler handelt es sich?
- Suchen Sie die Stelle im Code, an der
all_ingredient_locs
erstellt worden ist und springen Sie zu der erzeugenden Funktion. - 6 In der Rückgabe dieser Funktion wird eine von Python mitgelieferte Funktion benutzt. Prüfen Sie nach, welchen Typ die Rückgabe in diesem Fall hat.
Hinweis (nur bei Bedarf): Die gefragte Funktion…
…lautet json.load()
und hat je nach Form des eingegebenen JSON einen anderen Rückgabetypen.
Sie finden die Tabelle mit dieser Information unter
https://docs.python.org/3/library/json.html#encoders-and-decoders.
Wenn Sie sich mehr für JSON und der Handhabung von JSON in Python interessieren,
finden Sie in den Aufgaben m_json1 und m_json2 einen Einstieg.
Hinweis (nur bei Bedarf): Das eingegebene Argument von json.load()
…
…ist die Datei ingredients.json
. Es handelt sich um ein JSON-Array.
- 7 Sehen Sie sich noch einmal den entstehenden Rückgabetypen an und die Stelle, an der der Defekt das erste Mal aufgefallen ist: Welcher Datentyp wird von der aufrufenden Stelle eigentlich erwartet?
- 1 Implementieren Sie eine Korrektur an der in 6 gefundenen Stelle, die den richtigen Datentyp zurückgibt.
- 2 Machen Sie einen separaten Commit des korrigierten Quellcodes und zeigen Sie dann
git -P show HEAD
. - 3 Führen Sie das Programm
grocery_list.py
im Terminal aus. Geben Sie die Ausgabe des Programms mit der Eingabe0,0,4
an.
Wenn Sie der Aufgabe gefolgt sind, sollte der Output ohne Ausgabe von Fehlern funktionieren. Allerdings ist das Programm noch nicht fehlerfrei, wenn Sie die Ausgabe mit der oben gegebenen Beispielausgabe vergleichen. Darum kümmern wir uns aber erst in einkaufsliste-defekt2.
Abgabe
Geben Sie den Quellcode ab, wie er am Ende der Aufgabe vorliegt.
Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.
Geben Sie ein Markdown-Dokument ab mit knappen Antworten zu den oben gestellten Fragen
1, 2, … Geben Sie diese Marker mit an.
Geben Sie ggf. Beispiele oder benutzte Quellen an.