Gestione degli errori su Python#
La gestione degli errori è un aspetto fondamentale della programmazione. Gli errori possono verificarsi per molte ragioni, come input non validi, divisioni per zero, o tentativi di accesso a file inesistenti. Python fornisce strumenti per gestire questi errori in modo da evitare che il programma si blocchi inaspettatamente e per facilitare il debugging.
Lettura e comprensione degli errori#
Quando si verifica un errore in Python, il programma genera un messaggio di errore chiamato traceback. Questo messaggio include informazioni dettagliate sul tipo di errore e dove si è verificato nel codice. Imparare a leggere i tracebacks è essenziale per identificare la causa degli errori.
def divisione(a, b):
return a / b
# Questo genera un errore perché stiamo tentando di dividere per zero
divisione(10, 0)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
Cell In[1], line 5
2 return a / b
4 # Questo genera un errore perché stiamo tentando di dividere per zero
----> 5 divisione(10, 0)
Cell In[1], line 2, in divisione(a, b)
1 def divisione(a, b):
----> 2 return a / b
ZeroDivisionError: division by zero
Vediamo come interpretare questo traceback:
Traceback (most recent call last): indica che l’errore si è verificato nell’ultima operazione eseguita.
Cell In[..], line 5: mostra la linea di codice in cui l’errore è stato sollevato.
Cell In[..], line 2: mostra che l’errore si è verificato nella funzione divisione, alla riga 2.
ZeroDivisionError: division by zero: questo è il tipo di errore specifico (in questo caso un ZeroDivisionError), e la spiegazione dell’errore (“division by zero”).
Vediamo ora quali sono i tipi di errore più comuni in Python, e cosa li causa:
SyntaxError: si verifica quando il codice contiene errori di sintassi. Questo può accadere, ad esempio, se dimentichi una parentesi o un due punti.
if 10 > 5
print("Errore di sintassi")
Cell In[2], line 1
if 10 > 5
^
SyntaxError: expected ':'
TypeError: si verifica quando tenti di eseguire un’operazione su tipi di dati non compatibili.
print("10" + 5)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[3], line 1
----> 1 print("10" + 5)
TypeError: can only concatenate str (not "int") to str
NameError: si verifica quando tenti di usare una variabile o funzione che non è stata definita.
print(x)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[4], line 1
----> 1 print(x)
NameError: name 'x' is not defined
IndexError: si verifica quando tenti di accedere a un elemento di una lista usando un indice fuori dai limiti.
lista = [1, 2, 3]
print(lista[5])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[5], line 2
1 lista = [1, 2, 3]
----> 2 print(lista[5])
IndexError: list index out of range
KeyError: si verifica quando tenti di accedere a una chiave inesistente in un dizionario.
dizionario = {"nome": "Luca"}
print(dizionario["età"])
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Cell In[6], line 2
1 dizionario = {"nome": "Luca"}
----> 2 print(dizionario["età"])
KeyError: 'età'
ValueError: si verifica quando una funzione riceve un argomento valido per tipo, ma non per valore.
int("abc")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[7], line 1
----> 1 int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
Gestire gli errori con try e except#
Per prevenire l’interruzione del codice a causa di un errore, Python consente di gestire le eccezioni usando i blocchi try e except. Il codice che potrebbe causare un errore viene inserito all’interno del blocco try, e se si verifica un errore, il programma passa al blocco except.
Warning
Attenzione a non abusare della funzionalità di try e except, poiché tali funzioni possono rendere difficile debuggare il programma, se usate in maniera poco controllata.
Vediamone un esempio:
def divisione(a, b):
try:
risultato = a / b
except ZeroDivisionError:
print("Errore: divisione per zero non consentita!")
risultato = None
return risultato
print(divisione(10, 0)) # Genera errore 10 / 0
Errore: divisione per zero non consentita!
None
In questo esempio, se si verifica un errore di divisione per zero (ZeroDivisionError), il programma non si blocca ma stampa un messaggio di errore e restituisce None.