Capitolo 9: Errori & Eccezioni

Gestisci con eleganza gli errori a runtime, solleva eccezioni personalizzate e usa assert per il debug.

Scarica chapter9.py

Obiettivi

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

  1. Scrivi una funzione che legge un intero e riprova finché non ne inserisci uno valido.
  2. Crea un’eccezione personalizzata AuthenticationError e usala in una funzione di login.
  3. Implementa la copia di un file con try/finally per garantire la chiusura dei file.
  4. Aggiungi assert per validare gli input di funzioni in un modulo calcolatore.