• analiticas
  • Posts
  • Gestisci gli errori con try e except in Python

Gestisci gli errori con try e except in Python

Analisi a prova di imprevisti con Python

Una delle competenze fondamentali nella programmazione, è la gestione degli errori.

In Python, questo si ottiene utilizzando i blocchi try e except. Questi strumenti ci permettono di eseguire il codice in modo sicuro, prevenendo interruzioni inaspettate dovute a errori.

In questa micro-lezione vedremo come usare try e except quando lavoriamo con i dati.

Perché usare try e except?

Quando lavoriamo con i dati, spesso ci imbattiamo in situazioni impreviste: file mancanti, valori inattesi o errori di calcolo. Utilizzare try e except ci permette di gestire queste situazioni.

Questo è particolarmente utile se stai scrivendo del codice che non servirà soltanto per un’analisi ad-hoc, ma che sarà eseguito più e più volte, su set di dati diversi.

Come funzionano try e except?

Analizziamo rapidamente il funzionamento di try e except.

  • Il blocco try: qui aggiungerai il codice che potrebbe causare un errore. Pensa a questo blocco come ad una "zona sicura" dove tenti di fare qualcosa che potrebbe andare storto.

  • Il blocco except: qui decidi come gestire l'errore (se si verifica).

Esempi nell’analisi dei dati

Vediamo insieme alcuni esempi in cui l’uso di try e except può aiutarci, quando lavoriamo con i dati.

Per iniziare, importiamo le librerie pandas e numpy:

import pandas as pd
import numpy as np

Lettura di un file

Supponiamo di voler leggere un file CSV. Se non sai come fare, puoi leggere la micro-lezione che spiega come importare dati in pandas da un file .csv.

Se il file non esiste, il programma potrebbe interrompersi. Utilizzando try e except, possiamo gestire questa situazione:

try:
    df = pd.read_csv('dati.csv')
except FileNotFoundError:
    print("Il file non è stato trovato")

Qualora il codice non trovasse il file .csv, un errore di tipo FileNotFoundError sarà generato.

Puoi anche specificare un messaggio di errore personalizzato, come nell’esempio.

Conversione di tipi di dati

In alcuno casi potremmo voler convertire una colonna di un dataframe in un tipo di dati diverso. Qualora alcuni dati siano incompatibili con la conversione, possiamo usare try e except per gestire l'errore che ne conseguirà.

Immaginiamo di avere un dataframe con una colonna chiamata “Punti”, di cui vogliamo convertire i valori in numeri interi.

Ecco come fare usando try e except:

try:
    df['Punti'] = df['Punti'].astype(int)
except ValueError:
    print("Impossibile convertire alcuni valori in numeri interi")

Qualora fosse impossibile trasformare tutti i valori in numeri interi, un errore di tipo ValueError e un messaggio di errore personalizzato saranno generati.

Calcoli matematici

Quando eseguiamo calcoli matematici, potremmo imbatterci in errori come la divisione per zero. Possiamo gestire questi errori per evitare che il programma si interrompa.

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

In questo caso, un errore di tipo ZeroDivisionError e un messaggio di errore saranno generati.

Perché specificare il tipo di errore

Avrai notato che negli esempi visti fin qui, abbiamo sempre specificato il tipo di errore nel blocco except.

Questo non è sempre necessario ma è consigliato. Infatti, qualora il tuo codice potesse generare più tipi di errori, questo ti permetterà di capire meglio cosa sta succedendo.

In generale, i vantaggi di specificare il tipo di errore nel blocco except sono tre:

  1. Più precisione: specificando il tipo di errore, puoi gestire diversi tipi di errori in modi differenti.

  2. Più chiarezza: quando qualcuno legge il tuo codice, può immediatamente vedere quali errori stai anticipando e gestendo.

  3. Meno sorprese: se usi un blocco except generico (uno che non specifica un tipo di errore), questo catturerà tutti gli errori, inclusi quelli che potresti non aver previsto. Questo può nascondere bug.

Facciamo un esempio: immaginiamo di voler creare una variabile chiamata “numero” che consiste nel trasformare un determinato valore in numero intero.

Utilizzeremo due blocchi except specificando due casi possibili.

Se il valore da convertire in numero intero è una stringa di testo:

try:
    numero = int("abc")
except ValueError:
    print("ValueError: per favore, inserisci un numero valido.")
except TypeError:
    print("TypeError: assicurati di usare i tipi di dati corretti.")

Avremo questo risultato:

ValueError: per favore, inserisci un numero valido.

Come possiamo vedere, il primo blocco except è intervenuto, dato che nel nostro caso avevamo causato un errore di tipo ValueError.

Se invece il valore da trasformare in numero intero è un valore nullo come in questo caso:

try:
    numero = int(None)
except ValueError:
    print("ValueError: per favore, inserisci un numero valido.")
except TypeError:
    print("TypeError: assicurati di usare i tipi di dati corretti.")

Il risultato del nostro codice sarà:

TypeError: assicurati di usare i tipi di dati corretti.

In questo caso, l’esecuzione del codice è andata oltre il primo blocco except, dato che convertire un valore nullo in un numero non causa un ValueError. Al contrario, il secondo blocco except, quello con TypeError, è intervenuto.

Quindi, il tipo di errore specificato nel blocco except determinerà quale blocco except sarà eseguito.

Conclusione

L'uso di try e except è essenziale per gestire gli errori in modo controllato, migliorando la qualità del nostro codice e la sua versatilità.

Alla prossima micro-lezione 👋