Gestione Delle Eccezioni (tryexcept)
Gestione delle Eccezioni (Try…Except) in Python¶
Obiettivi della Lezione¶
Al termine di questa lezione, sarai in grado di:
- Comprendere il concetto di eccezioni e perché sono importanti nella programmazione.
- Utilizzare le strutture
try
,except
,else
efinally
per gestire le eccezioni in Python. - Identificare e gestire diverse tipologie di eccezioni.
- Migliorare la robustezza e l’affidabilità del tuo codice attraverso una corretta gestione degli errori.
Introduzione¶
Nel corso dello sviluppo di un programma, possono verificarsi situazioni inattese che interrompono il normale flusso di esecuzione. Questi eventi, noti come eccezioni, possono derivare da errori di programmazione, input non validi o problemi esterni come la mancanza di connessione a una risorsa. La gestione delle eccezioni è fondamentale per creare applicazioni robuste e affidabili, in grado di gestire gli errori in modo elegante senza arrestarsi improvvisamente.
Spiegazione Teorica¶
Che cos’è un’Eccezione?¶
Un’eccezione è un evento anomalo che si verifica durante l’esecuzione di un programma e interrompe il normale flusso dell’applicazione. In Python, quando si verifica un errore, il linguaggio genera (o “solleva”) un’eccezione.
Struttura Base di Try…Except¶
La gestione delle eccezioni in Python avviene principalmente attraverso le parole chiave try
e except
. La sintassi base è la seguente:
try:
# Codice che potrebbe generare un'eccezione
except NomeEccezione:
# Codice da eseguire se si verifica l'eccezione
try
: contiene il blocco di codice che potrebbe causare un’eccezione.except
: definisce il blocco di codice da eseguire se si verifica l’eccezione specificata.
Gestione di Eccezioni Specifiche¶
È possibile gestire eccezioni specifiche per avere un controllo più preciso sugli errori:
try:
# Codice rischioso
except ZeroDivisionError:
# Gestione specifica per la divisione per zero
except ValueError:
# Gestione specifica per errori di valore
Blocco Else¶
Il blocco else
viene eseguito se non si verifica alcuna eccezione:
try:
# Codice rischioso
except SomeException:
# Gestione dell'eccezione
else:
# Codice da eseguire se non si verifica alcuna eccezione
Blocco Finally¶
Il blocco finally
viene eseguito sempre, indipendentemente dal verificarsi o meno di un’eccezione:
try:
# Codice rischioso
except SomeException:
# Gestione dell'eccezione
finally:
# Codice che viene sempre eseguito
try:
numero = int(input("Inserisci un numero: "))
risultato = 10 / numero
print(f"Il risultato è {risultato}")
except ZeroDivisionError:
print("Errore: Divisione per zero non consentita.")
Inserisci un numero: 0 Errore: Divisione per zero non consentita.
Spiegazione:
- Il programma chiede all’utente di inserire un numero.
- Tenta di dividere 10 per il numero inserito.
- Se l’utente inserisce
0
, viene sollevata un’eccezioneZeroDivisionError
. - L’eccezione viene catturata e gestita nel blocco
except
, evitando che il programma si arresti.
Esempio 2: Gestione di Più Eccezioni¶
try:
lista = [1, 2, 3]
indice = int(input("Inserisci l'indice dell'elemento che vuoi visualizzare: "))
print(f"Elemento: {lista[indice]}")
except IndexError:
print("Errore: Indice fuori dal range della lista.")
except ValueError:
print("Errore: Devi inserire un numero intero.")
Inserisci l'indice dell'elemento che vuoi visualizzare: 8 Errore: Indice fuori dal range della lista.
Spiegazione:
- Il programma tenta di accedere a un elemento di una lista basato sull’indice fornito dall’utente.
- Se l’utente inserisce un valore non numerico, viene sollevata un’eccezione
ValueError
. - Se l’indice è fuori dai limiti della lista, viene sollevata un’eccezione
IndexError
. - Entrambe le eccezioni vengono gestite separatamente per fornire messaggi di errore specifici.
Esempio 3: Uso di Else e Finally¶
try:
file = open("dati.txt", "r")
contenuto = file.read()
except FileNotFoundError:
print("Errore: Il file non esiste.")
else:
print("Il file è stato letto con successo.")
print(contenuto)
finally:
if 'file' in locals():
file.close()
print("Il file è stato chiuso.")
Errore: Il file non esiste.
Spiegazione:
- Il programma tenta di aprire e leggere un file.
- Se il file non esiste, viene sollevata un’eccezione
FileNotFoundError
. - Se non si verifica alcuna eccezione, il blocco
else
viene eseguito. - Il blocco
finally
si assicura che il file venga chiuso indipendentemente dal successo dell’operazione.
try:
num1 = float(input("Inserisci il primo numero: "))
num2 = float(input("Inserisci il secondo numero: "))
operazione = input("Inserisci l'operazione (+, -, *, /): ")
if operazione == '+':
risultato = num1 + num2
elif operazione == '-':
risultato = num1 - num2
elif operazione == '*':
risultato = num1 * num2
elif operazione == '/':
risultato = num1 / num2
else:
raise ValueError("Operazione non valida.")
print(f"Risultato: {risultato}")
except ZeroDivisionError:
print("Errore: Divisione per zero non consentita.")
except ValueError as e:
print(f"Errore: {e}")
Inserisci il primo numero: 4 Inserisci il secondo numero: a Errore: could not convert string to float: 'a'
Esercizio 2: Lettura di un Numero da File¶
Crea un programma che legga un numero da un file chiamato numero.txt
e calcoli la radice quadrata. Gestisci le possibili eccezioni che possono verificarsi.
Suggerimenti:
- Gestisci l’assenza del file.
- Gestisci se il contenuto non è un numero.
- Gestisci se il numero è negativo (non puoi calcolare la radice quadrata di un numero negativo senza numeri complessi).
Buone Pratiche e Consigli¶
Sii Specifico nelle Eccezioni: Gestisci eccezioni specifiche invece di usare un generico
except Exception
. Questo rende il codice più leggibile e facilita il debug.Non Nascondere gli Errori: Evita di lasciare un blocco
except
vuoto o con un semplicepass
. Fornisci sempre un feedback utile o gestisci l’eccezione in modo appropriato.Utilizza il Blocco Finally per il Clean-up: Se il tuo codice apre risorse (file, connessioni di rete, ecc.), assicurati di rilasciarle nel blocco
finally
.Non Abusare delle Eccezioni: Le eccezioni non dovrebbero sostituire il flusso logico normale del programma. Utilizzale per gestire situazioni realmente eccezionali.
Logging degli Errori: Considera l’utilizzo del modulo
logging
per registrare le eccezioni, specialmente in applicazioni più grandi.
Conclusione¶
La gestione delle eccezioni è un elemento cruciale nello sviluppo di software robusti. Python offre strumenti potenti e flessibili per catturare e gestire gli errori, permettendoti di controllare il comportamento del tuo programma in situazioni anomale. Applicando le buone pratiche viste in questa lezione, potrai scrivere codice più affidabile e mantenibile.
Risorse Aggiuntive¶
- Documentazione Ufficiale Python: Handling Exceptions
- Libro Consigliato: Python Crash Course di Eric Matthes
- Video Tutorial: Using Try/Except Blocks for Error Handling