Salta ai contenuti
Manuale LogoManuale Logo

Gestione degli errori

Un programma può incontrare situazioni che non sa gestire: l’utente inserisce testo al posto di un numero, il codice divide per zero o apre un file inesistente.

In questi casi Python “lancia” un errore, chiamato tecnicamente eccezione. Se non lo gestisci, il programma si interrompe e mostra un messaggio.

Esempi di errori comuni:

print(10 / 0) # ZeroDivisionError: non si può dividere per zero
print("ciao" + 5) # TypeError: non puoi sommare testo e numero
int("pippo") # ValueError: "pippo" non è un numero
print(variabile_che_non_c_e) # NameError: variabile non definita
lista = [1, 2, 3]
print(lista[10]) # IndexError: la lista non ha la posizione 10

Inserisci il codice che può fallire in un blocco try. Se si verifica un errore, Python passa al blocco except:

try:
risultato = 10 / 0
except ZeroDivisionError:
print("Non puoi dividere per zero!")

In altre parole: “Prova a eseguire questo codice. Se si verifica un ZeroDivisionError, invece esegui quest’altro.”

Puoi usare più blocchi except, uno per ogni tipo di errore da gestire:

try:
numero = int(input("Inserisci un numero: "))
risultato = 10 / numero
print(f"10 / {numero} = {risultato}")
except ValueError:
print("Devi inserire un numero valido, non del testo.")
except ZeroDivisionError:
print("Non puoi dividere per zero.")

Il blocco else viene eseguito solo se non si è verificato nessun errore:

try:
numero = int(input("Inserisci un numero: "))
risultato = 10 / numero
except (ValueError, ZeroDivisionError) as e:
print(f"Errore: {e}")
else:
print(f"Risultato: {risultato}") # viene eseguito solo se tutto è ok

Il blocco finally viene sempre eseguito, con o senza errori. Puoi usarlo per la “pulizia”, come chiudere un file o liberare risorse:

try:
file = open("esempio.txt", "r")
contenuto = file.read()
except FileNotFoundError:
print("File non trovato.")
finally:
print("Operazione completata (con o senza errori).")

Puoi salvare il messaggio di errore con as e stamparlo:

try:
x = int("pippo")
except ValueError as e:
print(f"Dettaglio errore: {e}")
# Dettaglio errore: invalid literal for int() with base 10: 'pippo'
Errore Quando succede
ValueError Valore sbagliato per il tipo (es. int("abc"))
TypeError Tipo sbagliato (es. "ciao" + 5)
ZeroDivisionError Divisione per zero
NameError Variabile non definita
IndexError Indice fuori dalla lista
KeyError Chiave non trovata nel dizionario
FileNotFoundError File non trovato
while True:
try:
a = float(input("Numeratore: "))
b = float(input("Denominatore: "))
risultato = a / b
except ValueError:
print("Inserisci solo numeri validi.")
continue
except ZeroDivisionError:
print("Non si può dividere per zero.")
continue
else:
print(f"Risultato: {risultato}")
break