Python - Gestione delle Eccezioni

Ciao, futuri maghi Python! Sono entusiasta di essere il tuo guida in questo avventuroso viaggio nel mondo della gestione delle eccezioni in Python. Come persona che ha insegnato programmazione per anni, posso dirti che capire le eccezioni è come imparare a cavalcare una bicicletta con le ruote da apprendimento - potrebbe sembrare complicato all'inizio, ma una volta che ne hai preso la mano, sarai in grado di andare liscio in un batter d'occhio!

Python - Exceptions

Cos'è un'Eccezione?

Prima di immergerci nel profondo, iniziamo con le basi. Immagina di stare cucinando un torta (resta con me, prometto che questo si relaziona a Python!). Hai la tua ricetta (il tuo codice), i tuoi ingredienti (i tuoi dati), e sei pronto a partire. Ma cosa succede se ti mancano le uova a metà strada? Questo è un'eccezione nel mondo della pasticceria!

In Python, un'eccezione è un errore che si verifica durante l'esecuzione di un programma. È come un bandierino rosso che spunta dicendo: "Attenzione! Qualcosa non va proprio!"

Guardiamo un esempio semplice:

print(10 / 0)

Se esegui questo codice, Python solleverà un ZeroDivisionError. Sta dicendo: "Ehi, non puoi dividere per zero! Non è permesso nella mia cucina... Voglio dire, ambiente di programmazione!"

Gestione delle Eccezioni in Python

Ora che sappiamo cosa sono le eccezioni, impariamo come gestirle con grazia. In Python, usiamo i blocchi try e except per catturare e gestire le eccezioni.

Ecco la struttura di base:

try:
# Codice che potrebbe sollevare un'eccezione
except TipoEccezione:
# Codice per gestire l'eccezione

Modifichiamo il nostro esempio precedente:

try:
risultato = 10 / 0
print(risultato)
except ZeroDivisionError:
print("Ops! Non puoi dividere per zero.")

Quando esegui questo codice, invece di crashare, stampa: "Ops! Non puoi dividere per zero."

La Clausola except Senza Eccezioni Specifiche

A volte, potresti voler catturare qualsiasi eccezione si verifichi. In questo caso, puoi usare una clausola except senza specificare un tipo di eccezione:

try:
# Qualche codice rischioso
x = int(input("Inserisci un numero: "))
y = 10 / x
print(y)
except:
print("Qualcosa è andato storto!")

Questo catturerà qualsiasi eccezione che si verifichi nel blocco try. Tuttavia, è generalmente meglio catturare eccezioni specifiche quando possibile, poiché rende il codice più preciso e più facile da debuggare.

La Clausola except Con Multiple Eccezioni

Puoi anche gestire più eccezioni in una singola clausola except:

try:
x = int(input("Inserisci un numero: "))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("Input non valido o divisione per zero!")

Questo codice catturerà sia ValueError (se l'utente inserisce un valore non numerico) che ZeroDivisionError.

La Clausola try-finally

La clausola finally viene utilizzata per il codice che deve essere eseguito indipendentemente dal verificarsi di un'eccezione. È come il personale di pulizia dopo una festa - arriva sempre, indipendentemente da come è andata la festa!

try:
f = open("esempio.txt", "r")
# Operazioni sul file
except FileNotFoundError:
print("Il file non esiste!")
finally:
f.close()  # Questo verrà eseguito sempre, anche se si verifica un'eccezione

Argomento di un'Eccezione

Le eccezioni possono portare informazioni aggiuntive. Puoi accedere a queste informazioni nel tuo blocco except:

try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"Si è verificato un errore: {e}")

Questo stampa: "Si è verificato un errore: divisione per zero"

Sollevare un'Eccezione

A volte, potresti voler sollevare un'eccezione tuo. È come essere l'arbitro in una partita e chiamare un fallo:

def controlla_eta(eta):
if eta < 0:
raise ValueError("L'età non può essere negativa!")
print(f"La tua età è {eta}")

try:
controlla_eta(-5)
except ValueError as e:
print(e)

Questo stampa: "L'età non può essere negativa!"

Eccezioni Definite dall'Utente

Puoi anche creare i tuoi tipi di eccezione. È come inventare una nuova regola in un gioco:

class TroppiPizzeError(Exception):
pass

def ordina_pizza(numero):
if numero > 100:
raise TroppiPizzeError("Non puoi ordinare più di 100 pizze!")
print(f"Ordine per {numero} pizze effettuato con successo.")

try:
ordina_pizza(101)
except TroppiPizzeError as e:
print(e)

Assert in Python

Gli assert sono un modo per assicurarsi che determinate condizioni siano soddisfatte. Sono come piccoli checkpoint nel tuo codice:

def divide(a, b):
assert b != 0, "Il divisore non può essere zero!"
return a / b

try:
risultato = divide(10, 0)
except AssertionError as e:
print(e)

Questo stampa: "Il divisore non può essere zero!"

Eccezioni Standard

Python viene con una serie di eccezioni built-in. Ecco alcune delle più comuni:

Nome Eccezione Descrizione
ZeroDivisionError Sollevato quando si verifica una divisione o un modulo per zero
ValueError Sollevato quando una funzione riceve un argomento di tipo corretto ma valore improprio
TypeError Sollevato quando un'operazione o una funzione viene applicata a un oggetto di tipo inappropriato
NameError Sollevato quando un nome locale o globale non viene trovato
FileNotFoundError Sollevato quando un file o directory richiesto non esiste
IndexError Sollevato quando una sottoscrizione di sequenza è fuori intervallo
KeyError Sollevato quando una chiave di dizionario non viene trovata
ImportError Sollevato quando una dichiarazione di importazione fallisce

E qui avete tutto, ragazzi! Avete appena completato il vostro corso di crash su Python exception handling. Ricordate, le eccezioni non sono i vostri nemici - sono più come segnali utili che vi guidano verso un codice migliore e più robusto. Continuate a praticare, a sperimentare, e presto gestireste le eccezioni come professionisti. Buon coding!

Credits: Image by storyset