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