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!

Python - Raising Exceptions

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:

  1. Indicare errori o situazioni inusuali
  2. Controllare il flusso del nostro programma
  3. 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:

  1. Definiamo una funzione divide(a, b) che controlla se b è zero.
  2. Se b è zero, solleviamo una ValueError con un messaggio personalizzato.
  3. 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:

  1. Definiamo un'eccezione personalizzata TooManyPizzasError.
  2. La nostra funzione order_pizza solleva questa eccezione se qualcuno ordina più di 100 pizza.
  3. 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:

  1. risky_operation() solleva sempre una ValueError.
  2. perform_operation() cattura l'eccezione, la registra e poi la rilancia.
  3. 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