CodeGym /Corso Java /Python SELF IT /Gestione delle eccezioni

Gestione delle eccezioni

Python SELF IT
Livello 17 , Lezione 2
Disponibile

3.1 Cattura delle eccezioni

Non parleremmo così tanto delle eccezioni se dovessimo semplicemente osservarle. Le eccezioni sono oggetti speciali con cui il tuo programma in Python può lavorare. La gestione delle eccezioni è un aspetto importante della programmazione, che permette di migliorare l'affidabilità e la resilienza dei programmi.

In Python per catturare e gestire le eccezioni si utilizzano le istruzioni try, except, else e finally. Queste strutture permettono di catturare errori che si verificano durante l'esecuzione del programma e intraprendere le azioni appropriate.

Struttura try-except

La struttura try-except è utilizzata per catturare e gestire le eccezioni. Il blocco try contiene il codice che può generare un'eccezione, mentre il blocco except contiene il codice che verrà eseguito in caso di eccezione.

Esempio:


try:
    result = 10 / 0
except ZeroDivisionError:
    print("Errore: divisione per zero.")

Se nel codice all'interno del blocco try si verifica un'eccezione ZeroDivisionError, questa verrà catturata dal blocco except e verrà eseguito il codice con la chiamata a print().

Gestione di più eccezioni

Puoi gestire diversi tipi di eccezioni, specificandoli in blocchi except separati.


try:
    result = int("abc")
except ZeroDivisionError:
    print("Errore: divisione per zero.")
except ValueError:
    print("Errore: valore non valido.")

Cattura di tutte le eccezioni

Se vuoi catturare tutte le eccezioni, puoi usare il blocco except senza specificare un tipo particolare di eccezione. Tuttavia, non è consigliato, poiché potrebbe rendere difficile il debug e nascondere errori importanti.


try:
    result = 10 / 0
except:
    print("Si è verificato un errore.")

3.2 Istruzioni else e finally

Oltre alle istruzioni try e except, ce ne sono altre due opzionali: else e finally. Ora te ne parlerò un po' più in dettaglio.

Struttura try-except-else

Il blocco else viene utilizzato per eseguire il codice, se nel blocco try non si sono verificate eccezioni.


try:
    result = 10 / 2
except ZeroDivisionError:
    print("Errore: divisione per zero.")
else:
    print(f"Risultato: {result}")

Struttura try-except-finally

Il blocco finally contiene codice che verrà eseguito indipendentemente dal fatto che si sia verificata o meno un'eccezione. È utile per liberare risorse o eseguire operazioni finali.


try:
    result = 10 / 0
except ZeroDivisionError:
    print("Errore: divisione per zero.")
finally:
    print("Questo blocco viene sempre eseguito.")

Esempio completo: try-except-else-finally

Esempio:


try:
    result = 10 / 2
except ZeroDivisionError:
    print("Errore: divisione per zero.")
else:
    print(f"Risultato: {result}")
finally:
    print("Questo blocco viene sempre eseguito.")

3.3 Esempio try-except-else-finally

Vediamo un esempio reale più grande. Ad esempio, proviamo a leggere dati da un file nel disco — cosa potrebbe essere più semplice?


file = open("file.txt", "r")
content = file.read()
print(content)

Cosa potrebbe andare storto? Ad esempio, tutto:

  • Il file potrebbe mancare. Potrebbe essere stato cancellato per errore, non salvato, o il tuo programma potrebbe essere eseguito su un altro computer, dove non è mai esistito.
  • Errore di lettura del file. Il tuo programma non ha accesso ad esso, perché è in una directory che richiede diritti amministrativi.
  • Un altro programma sta scrivendo nel file in questo momento e non puoi leggerlo — ha accesso esclusivo al file.

Non basta? Allora non dimenticare che, indipendentemente dal passaggio in cui si verifica l'errore durante il lavoro con il file, è necessario "chiuderlo" per permettere al sistema operativo di liberare le risorse allocate per il lavoro con quel file.

Quindi il codice reale sarebbe simile a questo:


try:
    file = open("non_existent_file.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("Errore: file non trovato.")
except IOError:
    print("Errore: errore di I/O.")
else:
    print(content)
finally:
    if 'file' in locals() and not file.closed:
        file.close()
        print("File chiuso.")

Benvenuto nel mondo reale, dove devi scrivere codice non solo per lo "scenario di lavoro", ma per tutti i possibili scenari che potrebbero andare storto.

Ok, non ti spaventerò — è più semplice di quanto sembri. Devi solo capire cosa sono le condizioni di frontiera (corner cases) e aggiungere il controllo degli errori standard al momento giusto. Il resto lo faranno i moderni framework per te.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION