Eccezioni
L’interprete Python è il responsabile dell’esecuzione del codice scritto nei moduli Python.
Per essere eseguito il codice viene prima controllato dal punto di vista sintattico. Un errore nella sintassi provoca una immediata interruzione da parte dell’interprete.
Quando il codice è corretto sintatticamente, ma contiene un errore di logica, si genera un errore di runtime (ovvero durante l’esecuzione): a questo punto l’interprete Python solleva una eccezione!
>>> 42 / 0
ZeroDivisionError: division by zero
Il programmatore può intercettare le eccezioni generate e gestirle in modo opportuno.
Vediamo il codice:
try:
# blocco di codice da verificare.
# indentato di 4 caratteri
except ErrorType1:
# blocco di codice da eseguire se nella clausola try accade un errore di tipo ErrorType1
# Se hai messo un try... almeno un except è obbligatorio!!!
# indentato di 4 caratteri
except ErrorType2:
# blocco di codice da eseguire se nella clausola try accade un errore di tipo ErrorType2
# indentato di 4 caratteri]
[else:
# la clausola opzionale else va DOPO le except
# Contiene codice da eseguire SOLO SE non si verificano ECCEZIONI.
# indentato di 4 caratteri]
[finally:
# blocco di codice da eseguire SEMPRE!
# indentato di 4 caratteri]
# ISTRUZIONE SUCCESSIVA
Vediamo un botto di esempi per meglio chiarire la struttura del codice descritta sopra!
try:
n = int(input("Inserisci un numero intero: "))
print("Il doppio è", n * 2)
except ValueError:
print("Non hai inserito un numero intero valido!")
try:
a = int(input("Numeratore: "))
b = int(input("Denominatore: "))
risultato = a / b
print("Risultato:", risultato)
except ValueError:
print("Devi inserire numeri interi!")
except ZeroDivisionError:
print("Non puoi dividere per zero!")
try:
eta = int(input("Quanti anni hai? "))
except ValueError:
print("Età non valida.")
else:
# eseguito SOLO se non ci sono stati errori nel try
if eta >= 18:
print("Sei maggiorenne")
else:
print("Sei minorenne")
finally:
# eseguito SEMPRE, con o senza errore
print("Grazie per aver usato il programma")
while True:
try:
n = int(input("Inserisci un numero positivo: "))
if n <= 0:
print("Il numero deve essere positivo, riprova")
continue
break
except ValueError:
print("Devi inserire un numero intero, riprova")
print("Hai inserito:", n)
Built-in Exceptions
Le eccezioni predefinite che incontrerete più spesso sono sicuramente queste:
| Eccezione | Quando si verifica |
|---|---|
| ValueError | valore “giusto” come tipo ma sbagliato come contenuto (es. int(“ciao”)) |
| ZeroDivisionError | divisione o modulo per zero |
| TypeError | operazione tra tipi incompatibili (es. “5” + 3) |
| NameError | uso di una variabile non definita |
| KeyboardInterrupt | l’utente interrompe il programma con Ctrl+C |
Esercizi
Esercizi per la comprensione della gestione delle eccezioni in Python.
Esercizio 1 — Divisione protetta
Chiedi due numeri interi all’utente e stampane il quoziente. Gestisci sia il caso in cui l’utente non inserisca un intero valido, sia il caso di divisione per zero, con messaggi diversi per ciascun errore.
Esercizio 2 — Media di due voti
Chiedi due voti (numeri, anche con la virgola) e calcolane la media. Se l’utente inserisce un valore non numerico, stampa un messaggio d’errore e termina senza calcolare la media.
Tip
float()sollevaValueErrorcomeint()
Esercizio 3 — Calcolatrice a 4 operazioni
Chiedi due numeri e un operatore (+, -, *, /). Esegui l’operazione richiesta gestendo:
- input numerico non valido (ValueError)
- divisione per zero (ZeroDivisionError)
- operatore sconosciuto (usa un else sul confronto con gli operatori validi)
Esercizio 4 — Input robusto con ciclo
Scrivi un programma che chiede ripetutamente un’età finché l’utente non inserisce un numero intero compreso tra 0 e 120. Ad ogni errore (sia di formato che di valore fuori range) stampa un messaggio specifico e richiedi di nuovo il dato.
Esercizio 5 — Conto alla rovescia sicuro
Chiedi un numero intero N e stampa un conto alla rovescia da N a 0 usando un ciclo while. Se l’utente inserisce un valore non intero, intercetta l’errore e chiedi di reinserirlo (riusa la tecnica dell’Esempio 4).
Esercizio 6 — Calcolo del BMI con finally
Chiedi peso (kg) e altezza (m) e calcola il BMI (BMI = peso / altezza**2). Usa try/except/else/finally:
exceptper input non numericoelseper stampare il risultato e la fascia (sotto/normo/sovrappeso) solo se il calcolo è andato a buon finefinallyper stampare sempre un messaggio di chiusura tipo “Calcolo completato”