Direct naar de hoofdinhoud
Module 2 · Les 4 van 48/36 in de cursus~12 min
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

Python
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 de try.

Het uitzonderingsbericht wordt opgevangen

Gebruik as om het uitzonderingsobject aan een naam te binden:

Python
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

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Een tupel typen vangt elke uitzondering op die typen (of subklassen) op.

De volledige structuur: proberen / behalve / anders / uiteindelijk

Python
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 exception
  • else — gebruik het voor code die afhangt van het succes van de try. 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:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

De 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 (bijvoorbeeld len(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 blok try wordt 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

Oefening#python.m2.l4.e1
Pogingen: 0Laden…

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'.

Editor laden…
Toon hint

int('abc') verhoogt ValueError.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#python.m2.l4.e2
Pogingen: 0Laden…

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.

Editor laden…
Toon hint

raise ValueError('...') binnen de functie; catch met behalve ValueError als e.

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#python.m2.l4.e3
Pogingen: 0Laden…

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\`.

Editor laden…
Toon hint

Gebruik try: resultaat = int(text_val) gevolgd door behalve ValueError: resultaat = Geen.

Oplossing beschikbaar na 3 pogingen