Fouten, validatie en debuggen · oefening
Vang een specifieke exceptie op
Stel dat iemand six typt waar jouw programma een hoeveelheid nodig heeft. Je weet al dat int("six") een ValueError veroorzaakt. Deze keer heeft het programma een nuttige reactie: het kan aangeven dat er geen hoeveelheid is verkregen en de aanroeper laten bepalen wat er moet gebeuren.
Dat is wat try en except uitdrukken:
def parse_quantity(text):
try:
quantity = int(text)
except ValueError:
return None
return quantity
Lees het als een kleine afspraak: probeer de omzetting en handel deze ene verwachte fout af als die optreedt. Python voert eerst het ingesprongen try-blok uit.
Als
int(text)slaagt, slaat de uitvoering hetexcept-blok over.Als die omzetting een
ValueErrorveroorzaakt, voert Python het bijbehorende blokexcept ValueErroruit.
De functie geeft None terug om aan te geven dat er geen geheel getal kon worden verkregen. Een aanroeper kan dat resultaat controleren:
result = parse_quantity("six")
if result is None:
print("No quantity available.")
else:
print(result)
Vang de fout op die je verwacht
Deze code vangt ValueError op, omdat ongeldige tekst voor een geheel getal een verwachte situatie is die de functie kan weergeven.
De code vangt niet elke mogelijke exceptie op. Als de functie een verkeerd gespelde variabelenaam bevat, moet een NameError zichtbaar blijven. Die programmeerfout verbergen zou het debuggen moeilijker maken.
Houd het bewaakte blok gericht
Zet alleen de bewerking die de verwachte exceptie kan veroorzaken binnen try:
try:
year = int(text)
except ValueError:
return None
Een klein blok maakt het verband duidelijk: de foutafhandeling hoort bij die omzetting. Als er veel ongerelateerde instructies in het blok staan, kan een exceptie van hetzelfde type uit de verkeerde instructie voor de verwachte fout worden aangezien.
Foutafhandeling hoort bij de afspraak van de functie
Zonder foutafhandeling stopt ongeldige tekst het programma. Met dit ontwerp belooft de functie een van twee resultaten:
een geheel getal wanneer de omzetting slaagt;
Nonewanneer de tekst geen geheel getal is.
Dat is een ontwerpkeuze, geen regel voor elk programma. Soms is opnieuw proberen beter. Soms moet een exceptie het programma stoppen, omdat de gegevens op een echte programmeerfout wijzen. Vang een exceptie alleen op wanneer je een zinvolle volgende stap kunt zetten.
Waarom gebruikt het voorbeeld except ValueError?
Opdracht
Maak parse_year(text) af.
Geef het omgezette gehele getal terug wanneer
textmetint()kan worden omgezet.Geef
Noneterug wanneer de omzetting eenValueErrorveroorzaakt.Vang alleen
ValueErrorop.
Behoud de twee voorbereide aanroepen. De uiteindelijke uitvoer moet zijn:
2026
None
Gebruik zodra het werkt Step op je afgeronde code om te zien hoe de geslaagde aanroep de foutafhandeling overslaat en de mislukte aanroep die binnengaat.