0%

JSON en CSV · oefening

Onjuiste invoer melden

Het project wijst slechte data nu af op de plek waar het die ontdekt. Probeer de twee meegeleverde foutgevallen vanuit een tijdelijke regel in de editor of de Python-console:

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

De eerste komt bij een rij waarvan de hoeveelheid many is. De tweede eindigt voordat de array en het object zijn afgesloten. Het zijn verschillende fouten en geen van beide hoort een mysterieuze gedeeltelijke catalog.json op te leveren.

Vang fouten op bij de gebruikersinterface

Functies op een lagere laag horen fouten te blijven opwerpen. Hun aanroepers kunnen het exceptiontype en de precieze oorzaak nodig hebben. De opdrachtregelgrens in main is de plek waar een korte, bruikbare melding bij verwachte slechte invoer nuttiger wordt dan een volledige traceback.

De converter kan redelijkerwijs deze fouten verwachten:

  • FileNotFoundError wanneer de benoemde invoer ontbreekt;

  • UnicodeDecodeError wanneer vermeende UTF-8-invoer geen UTF-8 is;

  • csv.Error bij onjuiste CSV-aanhalingstekens;

  • ValueError voor de schema- en waarderegels. json.JSONDecodeError is een subklasse van ValueError, dus dit dekt ook onjuist gevormde JSON wanneer een andere aanroeper de JSON-lezer gebruikt.

Vang alleen die tuple op. Een brede except Exception zou ook TypeError door een programmeerfout in de converter verbergen en ten onrechte als slechte data bestempelen.

Eén deterministische opdracht

Implementeer main() zodat die dit aanroept:

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

Druk bij een verwachte fout Could not convert catalog: af, gevolgd door de exceptionmelding, en geef 1 terug. Druk bij succes precies dit af:

Wrote 3 items to catalog.json.

Gebruik het werkelijke aantal items uit het teruggegeven document en geef 0 terug.

Behoud het bestaande bewaakte startpunt. Daardoor blijft het importeren van catalog.py veilig voor tests en andere programma’s, terwijl Run de opdracht uitvoert.

Er is een snelle manier om te controleren of je gericht opvangt in plaats van alles. Voeg tijdelijk raise TypeError("boom") bovenaan convert_catalog toe en voer het programma uit. Je wilt een traceback, geen Could not convert catalog: boom. Een TypeError daar betekent een gebrek in je eigen code; dat vermommen als slechte invoer zou je in het verkeerde bestand laten zoeken. Verwijder de regel daarna.

Twijfel je welke exceptions in de tuple horen, vraag Monty dan: “Welke van deze fouten betekenen slechte invoer, en welke betekenen een bug in mijn code?” Dat is het onderscheid waar deze hele les om draait.

Opdracht

Implementeer main() rond convert_catalog("catalog.csv", "catalog.json").

Vang alleen FileNotFoundError, UnicodeDecodeError, csv.Error en ValueError op; druk het aangegeven begin van de foutmelding af en geef 1 terug. Druk bij succes het werkelijke aantal items af in Wrote N items to catalog.json. en geef 0 terug. Laat onverwachte programmeerfouten zichtbaar.