Come gestire le eccezioni in Python (Prova-eccetto-finalmente)

Scopri come gestire le eccezioni in Python usando try, tranne, altro e infine blocchi. Scrivi codice Python privo di errori e resistente agli arresti anomali.

Prova questa soluzione nell'editor

Panoramica

Un software robusto deve essere preparato a gestire condizioni impreviste, come file mancanti, input utente non validi, errori del database o interruzioni della rete. Quando si verifica un errore in Python, solleva un'eccezione. Se non gestite, le eccezioni interrompono immediatamente il programma e stampano uno stack di traceback.

Lo strumento principale di Python per la gestione degli errori di runtime è il blocco "try-Exception". Inserisci il codice che potrebbe generare un errore all'interno del blocco "try" e definisci il codice di gestione degli errori all'interno di uno o più blocchi "eccetto". Specificare l'esatta classe dell'eccezione (come `ValueError` o `ZeroDivisionError`) è altamente raccomandato, poiché catturare tutte le eccezioni generiche (`eccetto:`) può mascherare i bug.

Per rendere il flusso delle eccezioni più espressivo, Python fornisce due blocchi aggiuntivi: `else` e `finally`. Il blocco "else" viene eseguito solo se non vengono sollevate eccezioni nel blocco "try", il che è utile per il codice che dovrebbe essere eseguito solo in caso di successo. Il blocco "finalmente" viene eseguito *sempre*, indipendentemente dal fatto che si sia verificata un'eccezione, rendendolo il luogo perfetto per pulizie come la chiusura di file o connessioni al database.

Codice e output di esecuzione

Questo script dimostra una solida gestione degli errori in Python utilizzando try, tranne, altro e infine.

handle_errors.py
Prova nell'editor
def divide_numbers(a, b):
    try:
        # Code that might raise an exception
        result = a / b
    except ZeroDivisionError:
        # Handling a specific exception
        print("Error: Cannot divide by zero!")
    except TypeError:
        # Handling another exception type
        print("Error: Inputs must be numbers!")
    else:
        # Run only if try block succeeded
        print(f"Success! Result of {a}/{b} is {result}")
    finally:
        # Runs no matter what
        print("Division attempt completed.")

divide_numbers(10, 2)
print("---")
divide_numbers(10, 0)
Uscita terminale
Success! Result of 10/2 is 5.0
Division attempt completed.
---
Error: Cannot divide by zero!
Division attempt completed.

Implementazione passo dopo passo

  • Inserisci il codice che potrebbe fallire all'interno di un blocco try.
  • Rileva tipi di errore specifici con tranne ExceptionType: blocchi per gestire gli errori in modo corretto.
  • Utilizzare else per il codice che deve essere eseguito solo in caso di blocchi try riusciti.
  • Utilizzare infine per garantire che le azioni di pulizia vengano eseguite indipendentemente dagli errori.

Domande frequenti

Posso catturare più eccezioni in un singolo blocco tranne?

Sì, puoi passarli come tupla: tranne (ValueError, TypeError) come e:.

Come posso sollevare le mie eccezioni?

Utilizzare la parola chiave raise seguita dall'istanza dell'eccezione: raise ValueError("Valore di configurazione non valido").

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.