Python - Generazione di Eccezioni
Ciao a tutti, aspiranti Pythonisti! Oggi entreremo nel mondo avventuroso della generazione di eccezioni in Python. Non preoccupatevi se siete nuovi alla programmazione: vi guiderò passo per passo attraverso questo concetto, proprio come ho fatto per innumerevoli studenti durante gli anni della mia docenza. Quindi, prendete una tazza del vostro bevande preferita e iniziamo questa avventura Python insieme!
Generazione di Eccezioni in Python
Immagina di stare cucinando un delizioso pasto, ma improvvisamente ti rendi conto che ti sei fatto scarico di un ingrediente cruciale. Cosa fai? Probabilmente interrompi la cottura e avvisi tutti del problema, giusto? Bene, ecco esattamente cosa significa generare eccezioni in Python: è un modo per segnalare che è avvenuto qualcosa di inaspettato o problematico nel tuo codice.
Perché Generare Eccezioni?
Generare eccezioni ci permette di:
- Indicare errori o situazioni inusuali
- Controllare il flusso del nostro programma
- Fornire feedback significativi agli utenti o ad altre parti del nostro codice
Iniziamo con un esempio semplice:
def divide(a, b):
if b == 0:
raise ValueError("Impossibile dividere per zero!")
return a / b
try:
risultato = divide(10, 0)
except ValueError as e:
print(f"Ops! Si è verificato un errore: {e}")
In questo esempio, solleviamo una ValueError
quando qualcuno tenta di dividere per zero. Analizziamo il codice:
- Definiamo una funzione
divide(a, b)
che controlla seb
è zero. - Se
b
è zero, solleviamo unaValueError
con un messaggio personalizzato. - Utilizziamo un blocco
try-except
per catturare l'eccezione e stampare un messaggio amichevole.
Quando esegui questo codice, vedrai:
Ops! Si è verificato un errore: Impossibile dividere per zero!
Generazione di Eccezioni Predefinite
Python offre una varietà di eccezioni predefinite che possiamo sollevare. Ecco una tabella di alcune comuni:
Eccezione | Descrizione |
---|---|
ValueError | Sollevata quando una funzione riceve un argomento del tipo corretto ma un valore inappropriato |
TypeError | Sollevata quando un'operazione o una funzione viene applicata a un oggetto di un tipo inappropriato |
IndexError | Sollevata quando una sottoscrizione di sequenza è fuori intervallo |
KeyError | Sollevata quando una chiave di dizionario non viene trovata |
FileNotFoundError | Sollevata quando un file o directory richiesto non esiste |
Vediamo alcuni esempi:
def check_age(età):
if not isinstance(età, int):
raise TypeError("L'età deve essere un intero")
if età < 0:
raise ValueError("L'età non può essere negativa")
print(f"La tua età è {età}")
try:
check_age("venti")
except TypeError as e:
print(f"Errore di tipo: {e}")
try:
check_age(-5)
except ValueError as e:
print(f"Errore di valore: {e}")
Quando esegui questo codice, vedrai:
Errore di tipo: L'età deve essere un intero
Errore di valore: L'età non può essere negativa
Generazione di Eccezioni Personalizzate
A volte, le eccezioni predefinite non sono sufficienti. È quando creiamo le nostre eccezioni personalizzate! È come essere un cuoco e creare le tue ricette uniche.
Creazione di Eccezioni Personalizzate
Per creare un'eccezione personalizzata, definiamo semplicemente una nuova classe che eredita dalla classe Exception
:
class TooManyPizzasError(Exception):
pass
def order_pizza(number):
if number > 100:
raise TooManyPizzasError("Whoa! Troppi pizza da gestire!")
print(f"Ordine confermato: {number} pizza")
try:
order_pizza(101)
except TooManyPizzasError as e:
print(f"Ordine fallito: {e}")
In questo esempio delizioso:
- Definiamo un'eccezione personalizzata
TooManyPizzasError
. - La nostra funzione
order_pizza
solleva questa eccezione se qualcuno ordina più di 100 pizza. - Catturiamo l'eccezione e stampiamo un messaggio amichevole.
Quando esegui questo codice, vedrai:
Ordine fallito: Whoa! Troppi pizza da gestire!
Rielancio delle Eccezioni
A volte, potresti voler catturare un'eccezione, fare qualcosa con essa e poi rilanciarla per essere gestita da qualcun altro. È come passare una patata calda in un gioco!
Ecco come puoi farlo:
def risky_operation():
print("Inizio operazione rischiosa...")
raise ValueError("Qualcosa è andato storto!")
def perform_operation():
try:
risky_operation()
except ValueError:
print("Errore catturato, lo registro...")
raise # Rilancia l'eccezione
try:
perform_operation()
except ValueError as e:
print(f"Operazione fallita: {e}")
In questo esempio:
-
risky_operation()
solleva sempre unaValueError
. -
perform_operation()
cattura l'eccezione, la registra e poi la rilancia. - Catturiamo l'eccezione rilanciata nel blocco
try-except
esterno.
Quando esegui questo codice, vedrai:
Inizio operazione rischiosa...
Errore catturato, lo registro...
Operazione fallita: Qualcosa è andato storto!
E qui avete tutto, ragazzi! Abbiamo coperto la generazione di eccezioni, eccezioni predefinite, eccezioni personalizzate e persino il rilancio delle eccezioni. Ricordate, le eccezioni non sono i vostri nemici: sono strumenti preziosi che aiutano a scrivere codice robusto e resistente agli errori.
Come sempre dico ai miei studenti, programmare è come imparare a cavalcare una bicicletta. Potresti cadere qualche volta, ma ogni caduta (o eccezione) ti insegna qualcosa di nuovo. Continuate a praticare, rimanete curiosi e non avete paura di sollevare alcune eccezioni lungo il percorso!
Buon coding, e che le vostre eccezioni siano sempre intenzionali! ?✨
Credits: Image by storyset