Modulelessen (4/4)
Foutafhandeling: try/except
Wanneer er tijdens runtime iets misgaat (een deling door nul, een ontbrekende sleutel, een
bewerking op incompatibele typen) genereert Python een uitzondering. Zonder
afhandeling onderbreekt de uitzondering het programma. Met try / except jij
kan het vangen en beslissen wat te doen.
De basisvorm
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- het blok
try:bevat de code die mogelijk mislukt; - de
except <ErrorType>:wordt alleen uitgevoerd als dat fouttype optreedt binnen detry.
Het uitzonderingsbericht wordt opgevangen
Gebruik as om het uitzonderingsobject aan een naam te binden:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"Meerdere soorten bij elkaar
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneEen tupel typen vangt elke uitzondering op die typen (of subklassen) op.
De volledige structuur: proberen / behalve / anders / uiteindelijk
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— gebruik het voor code die afhangt van het succes van detry. Bewaar het gescheiden, zodat u niet per ongeluk niet-gerelateerde uitzonderingen tegenkomt.finally— opschoning die altijd moet gebeuren (een bestand sluiten, een bron). Zowel uitgevoerd bij succes als bij fouten.
Een uitzondering indienen: raise
Soms ben jij degene die wil signaleren dat er iets mis is gegaan:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bDe meest voorkomende ingebouwde uitzonderingen die u tegenkomt en tegenkomt:
ValueError— de waarde heeft het juiste type, maar is onaanvaardbaar (bijvoorbeeld parseren).TypeError— het type is verkeerd (bijvoorbeeldlen(42)).KeyError/IndexError— ontbrekende sleutel/index.ZeroDivisionError— delen door nul.FileNotFoundError,PermissionError— bestandssysteembewerkingen.
De else- en final-clausules in try-blokken
Een try blok kan twee extra clausules definiëren:
else: wordt alleen uitgevoerd als het bloktrywordt voltooid zonder dat er uitzonderingen ontstaan.finally: altijd uitgevoerd, ongeacht of er een uitzondering is opgetreden. Dit is ideaal voor het opschonen van bronnen (bijvoorbeeld het sluiten van een geopend bestand of databaseverbinding).
Probeer het zelf
Schrijf een expressie die int('abc') probeert: als ValueError wordt gegenereerd, wijs dan de string 'errore' toe aan `result`; wijs anders het nummer toe. Evalueer 'resultaat'.
Toon hint
int('abc') verhoogt ValueError.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Definieer `divide(a, b)` wat a/b retourneert maar ValueError verhoogt met het bericht 'divisore zero' als b 0 is. Roep vervolgens verdeel(10, 0) aan binnen een try/except en wijs aan `message` de string van de gevangen uitzondering toe.
Toon hint
raise ValueError('...') binnen de functie; catch met behalve ValueError als e.
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
Schrijf een \`try-except\` blok om de string \`text_val = "abc"\` naar een geheel getal te converteren. Als de conversie een \`ValueError\` oplevert, wijst u \`None\` toe aan \`result\`. Wijs anders het geconverteerde nummer toe. Evalueer ten slotte het \`resultaat\`.
Toon hint
Gebruik try: resultaat = int(text_val) gevolgd door behalve ValueError: resultaat = Geen.
Oplossing beschikbaar na 3 pogingen