0%

JSON und CSV · Übung

Fehlerhafte Eingaben melden

Das Projekt lehnt ungültige Daten jetzt dort ab, wo es sie entdeckt. Probiere die beiden bereitgestellten Fehlerfälle mit einer vorübergehenden Zeile im Editor oder in der Python-Konsole aus:

read_catalog_csv("bad_catalog.csv")
read_catalog_json("bad_catalog.json")

Der erste erreicht eine Zeile, deren Menge many ist. Der zweite endet, bevor Array und Objekt geschlossen werden. Es sind unterschiedliche Fehler, und keiner sollte zu einer rätselhaften, unvollständigen catalog.json werden.

An der benutzerseitigen Grenze abfangen

Die Funktionen auf niedriger Ebene sollen weiterhin Ausnahmen auslösen. Ihre Aufrufer brauchen möglicherweise den Ausnahmetyp und die genaue Ursache. An der Kommandozeilengrenze in main ist bei erwarteten ungültigen Eingaben eine kurze Meldung mit nächstem Schritt nützlicher als ein vollständiger Traceback.

Der Konverter kann vernünftigerweise mit Folgendem rechnen:

  • FileNotFoundError, wenn die benannte Eingabedatei fehlt;

  • UnicodeDecodeError, wenn eine vermeintliche UTF-8-Eingabe kein UTF-8 ist;

  • csv.Error bei fehlerhaften CSV-Anführungszeichen;

  • ValueError für die Schema- und Wertregeln. json.JSONDecodeError ist eine Unterklasse von ValueError. Das deckt auch fehlerhaftes JSON ab, wenn die JSON-Lesefunktion von einem anderen Aufrufer verwendet wird.

Fange nur dieses Tupel ab. Ein breites except Exception würde auch einen TypeError durch einen Programmierfehler im Konverter verbergen und ihn fälschlich als Datenfehler bezeichnen.

Ein deterministischer Befehl

Implementiere main() so, dass es Folgendes aufruft:

convert_catalog("catalog.csv", "catalog.json")

Gib bei einem erwarteten Fehler Could not convert catalog: gefolgt von der Ausnahmemeldung aus und gib 1 zurück. Gib bei Erfolg genau Folgendes aus:

Wrote 3 items to catalog.json.

Verwende die tatsächliche Artikelanzahl aus dem zurückgegebenen Dokument und gib 0 zurück.

Behalte den vorhandenen geschützten Einstiegspunkt bei. Die Bedingung macht den Import von catalog.py für Tests und andere Programme sicher, während ein Druck auf Run den Befehl ausführt.

Es gibt einen schnellen Weg zu prüfen, ob deine Fehlerbehandlung eng begrenzt ist oder alles abfängt. Füge vorübergehend am Anfang von convert_catalog die Zeile raise TypeError("boom") ein und führe das Programm aus. Du möchtest einen Traceback sehen, nicht Could not convert catalog: boom. Ein TypeError an dieser Stelle bedeutet einen Fehler in deinem eigenen Code. Ihn als ungültige Eingabe zu verkleiden würde dich in der falschen Datei suchen lassen. Entferne die Zeile anschließend.

Wenn du unsicher bist, welche Ausnahmen ins Tupel gehören, frage Monty: „Welche dieser Fehler bedeuten ungültige Eingaben, und welche bedeuten einen Fehler in meinem Code?“ Genau diese Grenze zieht die ganze Lektion.

Aufgabe

Implementiere main() um convert_catalog("catalog.csv", "catalog.json") herum.

Fange nur FileNotFoundError, UnicodeDecodeError, csv.Error und ValueError ab; gib das festgelegte Fehlerpräfix aus und gib 1 zurück. Gib bei Erfolg die tatsächliche Artikelanzahl in Wrote N items to catalog.json. aus und gib 0 zurück. Lass unerwartete Programmierfehler sichtbar.