Fouten, validatie en debuggen
Vang alleen op wat je kunt afhandelen
Exceptieafhandeling is nuttig wanneer een programma een bepaalde fout verwacht en weet wat het daarna moet doen. Ze wordt schadelijk wanneer ze problemen verbergt die het programma niet echt kan afhandelen.
Vermijd een allesvanger
Deze code is te breed:
text = "3"
recipe_cost = 24
try:
servings = int(text)
total = recipe_cost / servngs
except:
print("Please enter a number.")
De verkeerd gespelde naam servngs veroorzaakt een NameError, geen probleem met het omzetten van invoer. Een kale except: vangt die toch op en drukt misleidend advies af. De gebruiker kan eindeloos getallen invoeren, maar daarmee wordt de typefout van de programmeur niet hersteld.
Hetzelfde probleem verschijnt bij:
except Exception:
print("Something went wrong.")
Dat is explicietere syntaxis, maar groepeert nog steeds veel ongerelateerde fouten.
Laat de foutafhandeling aansluiten op het herstel
Bewaak alleen de verwachte omzetting:
try:
servings = int(text)
except ValueError:
print("Please enter a whole number.")
Nu krijgt ongeldige tekst bruikbare uitleg. Een latere NameError, ZeroDivisionError of andere onverwachte exceptie blijft zichtbaar met een traceback.
Die zichtbaarheid is waardevol. Ze vertelt de programmeur wat er werkelijk moet worden hersteld.
Houd try-blokken klein
Vergelijk:
try:
count = int(text)
subtotal = count * price
print(make_label(subtotal))
except ValueError:
print("Enter a whole number.")
met:
try:
count = int(text)
except ValueError:
print("Enter a whole number.")
Het eerste blok bevat drie bewerkingen. Als een andere bewerking een ValueError veroorzaakt, kan de foutafhandeling ten onrechte de invoer de schuld geven. Het tweede blok maakt het bedoelde verband duidelijk.
Drie vragen voordat je een fout opvangt
Vraag jezelf af:
Welke bewerking kan precies mislukken?
Welke exceptie veroorzaakt die precies?
Welk zinvol herstel kan het programma uitvoeren?
Als je niet alle drie kunt beantwoorden, laat de exceptie dan zichtbaar terwijl je onderzoek doet.
Een exceptieafhandeling is geen manier om een programma betrouwbaar te verklaren. Betrouwbaarheid ontstaat door verwachte fouten te begrijpen, aannames te valideren en nuttig bewijs voor onverwachte fouten te behouden.
Wat is het grootste gevaar van een kale except: in invoercode voor beginners?
Welk try-blok is het makkelijkst te begrijpen bij het afhandelen van ongeldige tekst voor een geheel getal?