Python-exception handling: try, except, else en finally uitgelegd
Python-exception handling: try, except, else en finally uitgelegd
Deze gids wandelt je door Python's exception-handling constructen met praktische code-snippets en best-practice tips.
Video: Python-exception handling (try..except..finally)
Exceptions in Python
Python gooit ingebouwde exceptions wanneer een runtime-fout optreedt. De interpreter stopt het huidige codeblok en propageert de exception op de call stack tot een handler gevonden wordt. Bestaat geen handler, dan crasht het programma en print een traceback.
Overweeg de volgende call-keten: A roept B aan, wat C aanroept. Als C een exception gooit die lokaal niet afgehandeld wordt, bubbelt de exception op naar B en dan naar A. Onafgevangen exceptions resulteren in een abrupte programma-crash.
Exceptions vangen in Python
Om een exception af te vangen, plaats de potentiël onveilige code in een try-blok. De except-clausule bevat de logica die uitvoert wanneer een exception optreedt.
Hier is een beknopt voorbeeld dat de flow demonstreert:
# Importeer sys-module om exception-type te inspecteren
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("De entry is", entry)
r = 1 / int(entry)
break
except:
print("Oeps!", sys.exc_info()[0], "voorkwam.")
print("Volgende entry.")
print()
print("De reciproke van", entry, "is", r)
Uitvoer
De entry is a Oeps! <class 'ValueError'> voorkwam. Volgende entry. De entry is 0 Oeps! <class 'ZeroDivisionError'> voorkwam. Volgende entry. De entry is 2 De reciproke van 2 is 0.5
De code itereert over random_list. Als conversie naar int of deling faalt, handelt het except-blok de fout af, logt het en gaat door naar het volgende item. Bij succesvolle conversie breekt de lus en wordt de reciproke geprint.
Omdat alle ingebouwde exceptions erven van Exception, kun je ze generiek vangen:
# Importeer sys-module om exception-type te inspecteren
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("De entry is", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Oeps!", e.__class__, "voorkwam.")
print("Volgende entry.")
print()
print("De reciproke van", entry, "is", r)
De uitvoer is identiek, maar de handler refereert nu naar de specifieke exception-klasse via e.__class__.
Specifieke exceptions vangen in Python
Breed alle exceptions vangen kan bugs maskeren en debugging bemoeilijken. Lijst in plaats daarvan alleen de exception-types die je verwacht.
Een try-blok mag meerdere except-clausules bevatten; alleen de eerste matchende clause voert uit. Voorbeeld:
try:
# code die een fout kan gooien
pass
except ValueError:
# handle ValueError
pass
except (TypeError, ZeroDivisionError):
# handle TypeError of ZeroDivisionError
pass
except Exception:
# fallback voor elke andere exception
pass
Exceptions gooien in Python
Naast automatische exceptions kunnen ontwikkelaars fouten expliciet gooien met het raise-statement. Optioneel een bericht doorgeven voor duidelijkheid.
raise KeyboardInterrupt # Traceback: KeyboardInterrupt
raise MemoryError("Dit is een argument") # Traceback: MemoryError: Dit is een argument
try:
a = int(input("Voer een positief integer in: "))
if a <= 0:
raise ValueError("Dat is geen positief getal!")
except ValueError as ve:
print(ve)
Python try met else-clausule
De optionele else-clausule draait alleen wanneer het try-blok compleet zonder exception. Dit patroon houdt success-path code gescheiden van foutafhandeling.
Voorbeeld: reciproke van een even getal printen.
# programma om reciproke van even getallen te printen
try:
num = int(input("Voer een getal in: "))
assert num % 2 == 0
except:
print("Geen even getal!")
else:
reciproke = 1 / num
print(reciproke)
Uitvoer bij oneven getal:
Voer een getal in: 1 Geen even getal!
Uitvoer bij even getal:
Voer een getal in: 4 0.25
Let op: als num nul is, wordt ZeroDivisionError gegooid in het else-blok en niet gevangen door de voorgaande except-clausule.
Python try…finally
De finally-clausule garandeert dat cleanup-code draait ongeacht of een exception optrad. Dit is essentieel bij werken met externe bronnen zoals bestanden, netwerkverbindingen of GUIs.
Typisch gebruik met bestandsafhandeling:
try:
f = open("test.txt", encoding='utf-8')
# bestandsbewerkingen uitvoeren
finally:
f.close()
Het bestand wordt altijd gesloten, zelfs als een fout optreedt tijdens verwerking.
Python
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- C++ Exception Handling: Praktische Try, Catch, Throw Voorbeelden
- Python Keywords en Identifiers: Gereserveerde woorden en naamconventies onder de knie krijgen
- Python Statements, Indentatie en Comments: Een duidelijke gids
- Python Variabelen, Constanten en Literals – Een uitgebreide gids
- Python Type Conversie & Casting onder de knie krijgen: Een uitgebreide gids
- Python I/O en Module Imports onder de knie krijgen: Een praktische gids
- Python Pass Statement onder de knie krijgen: Een praktische gids
- Python Global, Local en Nonlocal Variabelen begrijpen
- Python-directory en bestandsbewerkingen beheersen
- Python-exception handling: try, except, else en finally uitgelegd