3.1 Cattura delle eccezioni
Non parleremmo così tanto delle eccezioni se dovessimo semplicemente osservarle. Le eccezioni sono oggetti speciali con cui il tuo programma in Python può lavorare. La gestione delle eccezioni è un aspetto importante della programmazione, che permette di migliorare l'affidabilità e la resilienza dei programmi.
In Python per catturare e gestire le eccezioni si utilizzano le istruzioni
try
, except
, else
e
finally
. Queste strutture permettono di catturare errori
che si verificano durante l'esecuzione del programma e intraprendere le azioni
appropriate.
Struttura try-except
La struttura try-except
è utilizzata per catturare e gestire
le eccezioni. Il blocco try
contiene il codice che può generare
un'eccezione, mentre il blocco except
contiene il codice che verrà eseguito
in caso di eccezione.
Esempio:
try:
result = 10 / 0
except ZeroDivisionError:
print("Errore: divisione per zero.")
Se nel codice all'interno del blocco try
si verifica un'eccezione
ZeroDivisionError
, questa verrà catturata dal blocco except
e verrà eseguito il codice
con la chiamata a print()
.
Gestione di più eccezioni
Puoi gestire diversi tipi di eccezioni, specificandoli in blocchi
except
separati.
try:
result = int("abc")
except ZeroDivisionError:
print("Errore: divisione per zero.")
except ValueError:
print("Errore: valore non valido.")
Cattura di tutte le eccezioni
Se vuoi catturare tutte le eccezioni, puoi usare il blocco
except
senza specificare un tipo particolare di eccezione. Tuttavia, non è
consigliato, poiché potrebbe rendere difficile il debug e nascondere errori importanti.
try:
result = 10 / 0
except:
print("Si è verificato un errore.")
3.2 Istruzioni else
e finally
Oltre alle istruzioni try
e except
, ce ne sono altre due
opzionali: else
e finally
. Ora te ne parlerò un po' più in dettaglio.
Struttura try-except-else
Il blocco else
viene utilizzato per eseguire il codice,
se nel blocco try
non si sono verificate eccezioni.
try:
result = 10 / 2
except ZeroDivisionError:
print("Errore: divisione per zero.")
else:
print(f"Risultato: {result}")
Struttura try-except-finally
Il blocco finally
contiene codice che verrà
eseguito indipendentemente dal fatto che si sia verificata o meno un'eccezione. È utile per
liberare risorse o eseguire operazioni finali.
try:
result = 10 / 0
except ZeroDivisionError:
print("Errore: divisione per zero.")
finally:
print("Questo blocco viene sempre eseguito.")
Esempio completo: try-except-else-finally
Esempio:
try:
result = 10 / 2
except ZeroDivisionError:
print("Errore: divisione per zero.")
else:
print(f"Risultato: {result}")
finally:
print("Questo blocco viene sempre eseguito.")
3.3 Esempio try-except-else-finally
Vediamo un esempio reale più grande. Ad esempio, proviamo a leggere dati da un file nel disco — cosa potrebbe essere più semplice?
file = open("file.txt", "r")
content = file.read()
print(content)
Cosa potrebbe andare storto? Ad esempio, tutto:
- Il file potrebbe mancare. Potrebbe essere stato cancellato per errore, non salvato, o il tuo programma potrebbe essere eseguito su un altro computer, dove non è mai esistito.
- Errore di lettura del file. Il tuo programma non ha accesso ad esso, perché è in una directory che richiede diritti amministrativi.
- Un altro programma sta scrivendo nel file in questo momento e non puoi leggerlo — ha accesso esclusivo al file.
Non basta? Allora non dimenticare che, indipendentemente dal passaggio in cui si verifica l'errore durante il lavoro con il file, è necessario "chiuderlo" per permettere al sistema operativo di liberare le risorse allocate per il lavoro con quel file.
Quindi il codice reale sarebbe simile a questo:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("Errore: file non trovato.")
except IOError:
print("Errore: errore di I/O.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("File chiuso.")
Benvenuto nel mondo reale, dove devi scrivere codice non solo per lo "scenario di lavoro", ma per tutti i possibili scenari che potrebbero andare storto.
Ok, non ti spaventerò — è più semplice di quanto sembri. Devi solo
capire cosa sono le condizioni di frontiera (corner cases
) e aggiungere il controllo
degli errori standard al momento giusto. Il resto lo faranno i moderni framework per
te.
GO TO FULL VERSION