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:
maingeeft0terug na het schrijven en melden van het gevraagde uitvoerbestand;maingeeft1terug na een verwachte fout bij het verwerken van de catalogus;argparse werpt
SystemExit(0)op voor hulp enSystemExit(2)voor grammaticafouten voordatmainde 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 naarsys.stderr, alleen voorFileNotFoundError,UnicodeDecodeError,csv.ErrorenValueError.Geef
1terug 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
0en grammaticafouten met status2.Laat onverwachte programmeerfouten ongewijzigd ontsnappen.
Houd importeren vrij van neveneffecten en behoud het exacte bewaakte startpunt
raise SystemExit(main()).