0%

Programma’s die argumenten accepteren · oefening

Resultaten van fouten scheiden

Het programma accepteert nu de volledige interface, maar één gewoonte uit hoofdstuk 7 hoort nog bij de oude vaste opdracht: verwachte fouten worden naar stdout afgedrukt. Een herbruikbare CLI moet resultaten en diagnostiek uit elkaar kunnen houden.

Verander de bestemming, niet welke exceptions je opvangt

Importeer sys en stuur vervolgens alleen de verwachte catalogusmelding naar stderr:

except (FileNotFoundError, UnicodeDecodeError, csv.Error, ValueError) as exc:
    print(f"Could not convert catalog: {exc}", file=sys.stderr)
    return 1

Behoud de exceptiontekst. De grenzen uit hoofdstuk 7 leveren afgebakende, deterministische meldingen die de mislukte kop, rij, het veld of de bestandsbewerking benoemen. Ze vervangen door Conversion failed zou het bruikbare deel weggooien.

Maak de tuple niet breder. Een TypeError door een programmeerfout moet nog steeds ontsnappen met zijn traceback. stderr betekent niet “vang alles op”; het betekent dat verwachte diagnostiek een aparte bestemming heeft.

Laat elke verantwoordelijke zijn eigen status behouden

Het uiteindelijke contract heeft nu drie verantwoordelijken:

  • main geeft 0 terug na het schrijven en melden van het gevraagde uitvoerbestand;

  • main geeft 1 terug na een verwachte fout bij het verwerken van de catalogus;

  • argparse werpt SystemExit(0) op voor hulp en SystemExit(2) voor grammaticafouten voordat main de conversie bereikt.

De bewaking blijft:

if __name__ == "__main__":
    raise SystemExit(main())

Die regel zet de status die main teruggeeft om in de processtatus wanneer het bestand draait. Bij importeren doet die niets. Verwerk geen argumenten, druk niets af en schrijf geen uitvoerbestand op moduleniveau: tests en latere projectcode moeten de functies kunnen importeren zonder per ongeluk de opdracht uit te voeren.

De snelste manier om te zien of je de twee stromen goed gebruikt, is ze in de shell te scheiden. Voer een mislukte opdracht uit waarbij > stdout naar een bestand stuurt. De fout hoort nog steeds op je scherm te verschijnen en het bestand hoort leeg te zijn. Staat de fout in het bestand, dan gaat die naar stdout.

Wat doet raise SystemExit(main())?

Opdracht

Maak de grens voor uitvoerstromen en status van de CLI af.

  • Importeer sys.

  • Druk de afgebakende melding Could not convert catalog: <cause> af naar sys.stderr, alleen voor FileNotFoundError, UnicodeDecodeError, csv.Error en ValueError.

  • Geef 1 terug voor die fouten en druk niets af naar stdout.

  • Behoud de exacte succesregel op stdout, met lege stderr en status 0.

  • Behoud het gedrag van argparse: hulp met status 0 en grammaticafouten met status 2.

  • Laat onverwachte programmeerfouten ongewijzigd ontsnappen.

  • Houd importeren vrij van neveneffecten en behoud het exacte bewaakte startpunt raise SystemExit(main()).