Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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!

Errore classico: divisione per zero
>>> 42 / 0
ZeroDivisionError: division by zero

Il programmatore può intercettare le eccezioni generate e gestirle in modo opportuno.

Vediamo il codice:

Struttura completa del codice per la gestione delle eccezioni
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/except semplice
try:
    n = int(input("Inserisci un numero intero: "))
    print("Il doppio è", n * 2)
except ValueError:
    print("Non hai inserito un numero intero valido!")
except multipli
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!")
else e finally
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")
ripetizione con gestione di eccezioni
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:

EccezioneQuando si verifica
ValueErrorvalore “giusto” come tipo ma sbagliato come contenuto (es. int(“ciao”))
ZeroDivisionErrordivisione o modulo per zero
TypeErroroperazione tra tipi incompatibili (es. “5” + 3)
NameErroruso di una variabile non definita
KeyboardInterruptl’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() solleva ValueError come int()


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:

  • except per input non numerico
  • else per stampare il risultato e la fascia (sotto/normo/sovrappeso) solo se il calcolo è andato a buon fine
  • finally per stampare sempre un messaggio di chiusura tipo “Calcolo completato”