Capitolo 9: Errori & Eccezioni
Gestisci con eleganza gli errori a runtime, solleva eccezioni personalizzate e usa assert per il debug.
Scaricachapter9.py
Obiettivi
- Distingui tra errori e eccezioni in Python.
- Usa
try
/except
per catturare eccezioni. - Sfrutta le clausole
else
efinally
. - Solleva eccezioni built-in con
raise
. - Definisci e usa eccezioni personalizzate.
- Impiega
assert
per controlli di coerenza.
1. Errori vs Eccezioni
Un errore è un problema nel codice (sintassi, indentazione) rilevato prima dell’esecuzione. Un’eccezione è un evento a runtime catturabile e gestibile.
# SyntaxError: mancano le parentesi
print "Hello"
# ZeroDivisionError a runtime
print(1/0)
2. Blocco try/except
Includi il codice che può fallire in try
, cattura eccezioni specifiche in except
.
try:
result = 10 / int(input("Inserisci un divisore: "))
print("Risultato:", result)
except ValueError:
print("Per favore inserisci un intero valido.")
except ZeroDivisionError:
print("Non è possibile dividere per zero.")
3. else & finally
else
si esegue se non si verifica eccezione;
finally
viene sempre eseguito.
try:
f = open("data.txt")
data = f.read()
except FileNotFoundError:
print("File mancante.")
else:
print("Dati letti:", data[:50])
finally:
f.close()
print("File chiuso.")
4. Sollevare eccezioni
Usa raise
per innescare manualmente un’eccezione.
def check_age(age):
if age < 0:
raise ValueError("L'età non può essere negativa")
return True
# chiamata
check_age(-5) # ValueError: L'età non può essere negativa
5. Eccezioni personalizzate
Estendi Exception
per definire le tue eccezioni.
class InvalidConfigurationError(Exception):
"""Sollevata quando la configurazione è invalida."""
pass
def load_config(cfg):
if "host" not in cfg:
raise InvalidConfigurationError("Manca il parametro host")
Puoi catturarla come qualsiasi eccezione built-in:
try:
load_config({})
except InvalidConfigurationError as e:
print("Errore di configurazione:", e)
6. Assertions
Usa assert
per controlli di coerenza interni.
Possono essere disabilitate con l’opzione -O
.
def factorial(n):
assert n >= 0, "n deve essere non negativo"
return 1 if n in (0,1) else n * factorial(n-1)
factorial(-1) # AssertionError: n deve essere non negativo
Esercizi
- Scrivi una funzione che legge un intero e riprova finché non ne inserisci uno valido.
- Crea un’eccezione personalizzata
AuthenticationError
e usala in una funzione di login. - Implementa la copia di un file con
try
/finally
per garantire la chiusura dei file. - Aggiungi
assert
per validare gli input di funzioni in un modulo calcolatore.