Gestione delle eccezioni in Python usando try, except e finally statement
Eccezioni in Python
Python ha molte eccezioni incorporate che vengono sollevate quando il vostro programma incontra un errore (qualcosa nel programma va storto).
Quando queste eccezioni si verificano, l’interprete Python ferma il processo corrente e lo passa al processo chiamante finché non viene gestito. Se non viene gestita, il programma va in crash.
Per esempio, consideriamo un programma dove abbiamo una funzione A
che chiama la funzione B
, che a sua volta chiama la funzione C
. Se si verifica un’eccezione nella funzione C
ma non viene gestita in C
, l’eccezione passa a B
e poi a A
.
Catching Exceptions in Python
In Python, le eccezioni possono essere gestite usando una dichiarazione try
.
L’operazione critica che può sollevare un’eccezione è posta all’interno della clausola try
. Il codice che gestisce le eccezioni è scritto nella clausola except
.
Possiamo quindi scegliere quali operazioni eseguire una volta catturata l’eccezione. Ecco un semplice esempio.
Output
In questo programma, scorriamo i valori della lista randomList. Come già detto, la parte che può causare un’eccezione è posta all’interno del blocco try
.
Se non si verifica alcuna eccezione, il blocco except
viene saltato e il flusso normale continua (per l’ultimo valore). Ma se si verifica un’eccezione, questa viene catturata dal blocco except
(primo e secondo valore).
Qui, stampiamo il nome dell’eccezione usando la funzione exc_info()
all’interno del modulo sys
. Possiamo vedere che a
causa ValueError
e 0
causa ZeroDivisionError
.
Siccome ogni eccezione in Python eredita dalla classe base Exception
, possiamo anche eseguire il suddetto compito nel modo seguente:
Questo programma ha lo stesso risultato del programma precedente.
Catturare eccezioni specifiche in Python
Nell’esempio precedente, non abbiamo menzionato alcuna eccezione specifica nella clausola except
.
Questa non è una buona pratica di programmazione perché catturerà tutte le eccezioni e gestirà ogni caso allo stesso modo. Possiamo specificare quali eccezioni una clausola except
dovrebbe catturare.
Una clausola try
può avere qualsiasi numero di clausole except
per gestire diverse eccezioni, tuttavia, solo una sarà eseguita nel caso in cui si verifichi un’eccezione.
Possiamo usare una tupla di valori per specificare più eccezioni in una clausola except. Ecco uno pseudo-codice di esempio.
try: # do something passexcept ValueError: # handle ValueError exception passexcept (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError passexcept: # handle all other exceptions pass
Risollevare eccezioni in Python
Nella programmazione Python, le eccezioni sono sollevate quando si verificano errori in fase di esecuzione. Possiamo anche sollevare manualmente delle eccezioni usando la parola chiave raise
.
Possiamo opzionalmente passare dei valori all’eccezione per chiarire perché quell’eccezione è stata sollevata.
Python try con clausola else
In alcune situazioni, si potrebbe voler eseguire un certo blocco di codice se il blocco di codice all’interno try
funziona senza alcun errore. Per questi casi, potete usare la parola chiave opzionale else
con l’istruzione try
.
Nota: Le eccezioni nella clausola else non sono gestite dalle clausole except precedenti.
Guardiamo un esempio:
Output
Se passiamo un numero dispari:
Enter a number: 1Not an even number!
Se passiamo un numero pari, il reciproco viene calcolato e visualizzato.
Enter a number: 40.25
Tuttavia, se passiamo 0, otteniamo ZeroDivisionError
poiché il blocco di codice dentro else
non è gestito dal precedente except
.
Python try…finally
L’istruzione try
in Python può avere una clausola opzionale finally
. Questa clausola viene eseguita a prescindere, ed è generalmente usata per rilasciare risorse esterne.
Per esempio, potremmo essere connessi ad un centro dati remoto attraverso la rete o lavorare con un file o un’interfaccia grafica utente (GUI).
In tutte queste circostanze, dobbiamo pulire la risorsa prima che il programma si fermi, sia che sia stato eseguito con successo o meno. Queste azioni (chiusura di un file, GUI o disconnessione dalla rete) vengono eseguite nella clausola finally
per garantire l’esecuzione.
Ecco un esempio di operazioni su file per illustrare questo.
try: f = open("test.txt",encoding = 'utf-8') # perform file operationsfinally: f.close()
Questo tipo di costrutto assicura che il file venga chiuso anche se si verifica un’eccezione durante l’esecuzione del programma.