Python - Il blocco try-except

Ciao, futuri maestri Python! Sono entusiasta di guidarvi attraverso il meraviglioso mondo della gestione degli errori in Python. Come insegnante di informatica del quartiere, ho visto innumerevoli studenti inciampare sugli errori, ma non temere! Alla fine di questo tutorial, gestirete le eccezioni come un professionista. Iniziamo!

Python - try-except Block

Il blocco try-except in Python

Immagina di stare cucinando una nuova ricetta. Non sei sicuro di avere tutti gli ingredienti, ma vuoi provare comunque. Questo è esattamente quello che fa il blocco try-except in Python - ti permette di provare del codice e gestire eventuali errori in modo elegante.

Ecco la struttura di base:

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

Guardiamo un esempio semplice:

try:
number = int(input("Inserisci un numero: "))
result = 10 / number
print(f"10 diviso {number} è {result}")
except:
print("Ops! Qualcosa è andato storto.")

In questo codice:

  1. Chiediamo all'utente di inserire un numero.
  2. Cerchiamo di dividere 10 per quel numero.
  3. Se qualcosa va storto (come inserire zero o un non-numero), catturiamo l'errore e stampiamo un messaggio amichevole.

Prova a eseguire questo codice con input diversi. Inserisci 2, poi 0, poi "banana". Vedi come gestisce ogni caso?

Gestione di più eccezioni

Ora, diventiamo più specifici. Diversi tipi di errori possono verificarsi, e potremmo volerli gestire in modo diverso. È come avere kit di pronto soccorso diversi per diversi tipi di ferite.

try:
number = int(input("Inserisci un numero: "))
result = 10 / number
print(f"10 diviso {number} è {result}")
except ValueError:
print("Non è un numero valido!")
except ZeroDivisionError:
print("Non puoi dividere per zero!")
except:
print("Qualcos'altro è andato storto.")

Qui, stiamo gestendo tre scenari:

  1. Se l'utente inserisce qualcosa che non è un numero (ValueError)
  2. Se l'utente inserisce zero (ZeroDivisionError)
  3. Qualunque altro errore inaspettato

Esegui questo codice con input come "cinque", 0, 2, e vedi come risponde diversamente!

Uso della clausola else con il blocco try-except

A volte, vogliamo eseguire del codice solo se non sono occorse eccezioni. È qui che entra in gioco la clausola else. Pensala come un premio per quando tutto va liscio!

try:
number = int(input("Inserisci un numero positivo: "))
if number <= 0:
raise ValueError("Non è un numero positivo!")
result = 10 / number
except ValueError as ve:
print(f"Errore: {ve}")
except ZeroDivisionError:
print("Non puoi dividere per zero!")
else:
print(f"10 diviso {number} è {result}")
print("Grazie per aver inserito un numero valido!")

In questo esempio:

  1. Controlliamo se il numero è positivo.
  2. Se non lo è, solleviamo la nostra ValueError.
  3. Se non occorrono eccezioni, il blocco else viene eseguito, dando un bel messaggio.

La clausola finally

Non ultimo, incontra la clausola finally. Questo blocco di codice verrà eseguito indipendentemente dall'occorrenza di un'eccezione o meno. È come pulire dopo aver cucinato, indipendentemente dal fatto che la ricetta sia stata un successo o un disastro.

try:
file = open("important_data.txt", "r")
content = file.read()
result = 10 / int(content)
except FileNotFoundError:
print("Il file non esiste!")
except ValueError:
print("Il file non contiene un numero valido!")
except ZeroDivisionError:
print("Il numero nel file è zero!")
else:
print(f"Il risultato è: {result}")
finally:
print("Chiudo il file...")
file.close()

In questo esempio:

  1. Cerchiamo di aprire un file e leggere un numero al suo interno.
  2. Gestiamo varie potenziali erreure.
  3. Se tutto va bene, stampiamo il risultato.
  4. Indipendentemente da quanto sia successo, siamo sicuri di chiudere il file nel blocco finally.

Riepilogo dei metodi di gestione delle eccezioni

Ecco una tabella utile che riepiloga i metodi di gestione delle eccezioni che abbiamo appreso:

Metodo Descrizione Caso d'uso
try Raccoglie il codice che potrebbe sollevare un'eccezione Sempre usato con except, else o finally
except Gestisce eccezioni specifiche Catturare e gestire errori
else Viene eseguito se non occorrono eccezioni nel blocco try Eseguire codice che dovrebbe essere eseguito solo se try ha successo
finally Viene sempre eseguito, indipendentemente dalle eccezioni Operazioni di pulizia (es. chiudere file)
raise Solleva manualmente un'eccezione Creare condizioni di errore personalizzate

Ricorda, una buona gestione degli errori è come indossare la cintura di sicurezza - potrebbe sembrare inutile fino a quando non hai davvero bisogno di essa! Pratica questi concetti, e presto scriverai codice Python robusto e resistente agli errori come un professionista.

Buon coding, e che le tue eccezioni siano sempre gestite con grazia!

Credits: Image by storyset