1.1 Emergere di un errore
Gli errori (e le eccezioni) sono parte integrante della programmazione. Si verificano quando il programma si imbatte in situazioni inaspettate che non può gestire. In Python c'è un sistema di gestione delle eccezioni che permette di intercettare e gestire gli errori, prevenendo la chiusura del programma.
Le eccezioni si verificano più frequentemente nelle seguenti situazioni:
Errori sintattici:
Questi errori vengono individuati nella fase di compilazione del codice e sono legati alla grammatica sbagliata del linguaggio Python. Ad esempio, due punti mancanti o parole chiave errate.
if True:
print("Hello")
Errori di runtime (Runtime Errors)
:
Questi errori si verificano durante l'esecuzione del programma e possono essere causati da varie ragioni, come la divisione per zero, l'accesso a un indice di lista inesistente, l'uso scorretto di tipi di dati e così via.
print(1 / 0) # ZeroDivisionError
Errori logici:
Questi errori si verificano quando il programma funziona senza intoppi, ma fornisce un risultato errato a causa di un errore nella logica del programma. Gli errori logici non causano eccezioni, e sono più difficili da correggere.
Gli errori logici vengono solitamente chiamati bug — come se fossero una sorta di piccolo difetto nel funzionamento del programma. Gli errori di runtime sono chiamati eccezioni. Per ogni tale errore, Python crea un oggetto speciale (eccezione) e lo "lancia" nel programma...
1.2 Il percorso delle eccezioni
Quando in Python si verifica un'eccezione, questa viene sollevata attraverso lo stack delle chiamate finché non viene gestita. Lo stack delle chiamate rappresenta la sequenza delle chiamate delle funzioni che hanno portato al verificarsi dell'eccezione.
Meccanismo di sollevamento delle eccezioni
- Verifica dell'eccezione: Quando si verifica un errore, Python crea un oggetto eccezione.
- Ricerca dell'handler per l'eccezione: L'interprete Python inizia la ricerca di un handler nel blocco di codice corrente. Se l'handler non viene trovato, passa al blocco di codice successivo che ha chiamato la funzione corrente.
- Sollevamento dell'eccezione attraverso lo stack: Questo processo si ripete finché non viene trovato un handler o lo stack delle chiamate si esaurisce.
- Terminazione del programma: Se non viene trovato un handler, il programma termina e viene visualizzato un messaggio di errore.
Esempio:
def func_a():
func_b()
def func_b():
func_c()
def func_c():
print(1 / 0) # Qui si verifica l'eccezione ZeroDivisionError
func_a()
In questo esempio, l'eccezione ZeroDivisionError
si verifica nella funzione
func_c
, poi viene sollevata attraverso lo stack delle chiamate passando per func_b
e func_a
.
Se non viene trovato nessun handler, il programma terminerà con
un errore.
1.3 Lettura del log
Quando il programma termina a causa di un'eccezione non gestita, Python visualizza una traccia dello stack (traceback), che aiuta gli sviluppatori a capire cosa è andato storto. La traccia dello stack contiene informazioni sulla sequenza delle chiamate delle funzioni che hanno portato al verificarsi dell'eccezione, e può essere analizzata per il debugging del programma.
Esempio di traccia dello stack
Traceback (most recent call last):
File "example.py", line 10, in
func_a()
File "example.py", line 2, in func_a
func_b()
File "example.py", line 5, in func_b
func_c()
File "example.py", line 8, in func_c
print(1 / 0)
ZeroDivisionError: division by zero
Analisi della traccia dello stack
- Tipo di eccezione e messaggio: Alla fine della traccia viene indicato il tipo
di eccezione e il messaggio. Nell'esempio fornito è
ZeroDivisionError: division by zero
. - Sequenza delle chiamate: La traccia dello stack mostra la sequenza delle chiamate
delle funzioni. Nel nostro esempio, l'errore si è verificato nella linea
print(1 / 0)
nella funzionefunc_c
, che è stata chiamata dafunc_b
, che a sua volta è stata chiamata dafunc_a
. - File e linee di codice: In ogni riga della traccia viene indicato il file e il numero della linea dove si è verificata la chiamata. Questo aiuta a trovare e correggere rapidamente l'errore nel codice.
Uso pratico della traccia dello stack
La traccia dello stack è uno strumento importante per il debugging e l'analisi dei programmi. Aiuta gli sviluppatori a capire la causa dell'errore e a trovare il posto nel codice dove si è verificato. Ecco alcuni consigli sull'uso della traccia dello stack:
- Lettura dal basso verso l'alto: Inizia l'analisi dalla chiamata più in basso nella traccia, poiché è il punto in cui si è verificata l'eccezione.
- Verifica di tutte le chiamate: Esamina tutte le chiamate nella traccia per capire il percorso attraverso il quale l'eccezione è stata propagata.
- Correzione del codice: Usa le informazioni della traccia per correggere il codice e prevenire errori simili in futuro.
Saprai di più sulle eccezioni nelle prossime lezioni.
GO TO FULL VERSION