Sobes.tech
Junior

Quali sono le caratteristiche della gestione delle eccezioni in Python?

sobes.tech AI

Risposta dell'AI

Le eccezioni in Python sono eventi che interrompono il flusso normale di esecuzione del programma. Sono oggetti che rappresentano errori.

Caratteristiche:

  • Gerarchia delle eccezioni: Tutte le eccezioni integrate sono classi e sono organizzate in una gerarchia basata sull'ereditarietà dalla classe base BaseException.
    # Esempio di gerarchia
    # BaseException -> Exception -> StandardError -> ...
    #                  Exception -> ArithmeticError -> ZeroDivisionError
    
  • Blocchi try...except...: Meccanismo principale per gestire le eccezioni.
    try:
        # Codice che può generare un'eccezione
        result = 10 / 0
    except ZeroDivisionError:
        # Gestione di un'eccezione specifica
        print("Divisione per zero!")
    except Exception as e:
        # Gestione di altre eccezioni
        print(f"Si è verificato un errore: {e}")
    
  • Più blocchi except: Permettono di gestire diversi tipi di eccezioni in modo diverso.
    try:
        # Codice
        value = int("abc")
    except ValueError:
        print("Formato numerico non valido.")
    except TypeError:
        print("Tipo di dato non valido.")
    
  • Blocco else: Si esegue se il blocco try termina senza eccezioni.
    try:
        # Codice
        result = 10 / 2
    except ZeroDivisionError:
        print("Divisione per zero!")
    else:
        print("Operazione completata con successo.")
    
  • Blocco finally: Si esegue sempre, indipendentemente dal fatto che si sia verificata un'eccezione o meno. Viene usato per liberare risorse.
    file = None
    try:
        file = open("myfile.txt", "r")
        # Lettura del file
    except FileNotFoundError:
        print("File non trovato.")
    finally:
        if file:
            file.close() # Chiusura garantita del file
    
  • Operatore raise: Viene usato per sollevare esplicitamente un'eccezione.
    def divide(a, b):
        if b == 0:
            raise ZeroDivisionError("Impossibile dividere per zero")
        return a / b
    
    try:
        divide(10, 0)
    except ZeroDivisionError as e:
        print(f"Errore: {e}")
    
  • Eccezioni personalizzate: È possibile creare proprie classi di eccezioni ereditando da Exception o da un'altra classe di eccezioni esistente.
    class CustomError(Exception):
        pass
    
    def process_data(data):
        if not data:
            raise CustomError("Dati vuoti")
    
    try:
        process_data([])
    except CustomError as e:
        print(f"Errore: {e}")
    
  • Gestione delle eccezioni usando il gestore di contesto with: Rende più semplice lavorare con risorse che richiedono una chiusura esplicita (come i file).
    try:
        with open("myfile.txt", "r") as file:
            # Lavoro con il file
            content = file.read()
    except FileNotFoundError:
        print("File non trovato.")
    # Il file viene chiuso automaticamente all'uscita dal blocco 'with'
    
  • Concatenamento di eccezioni: Durante la gestione di un'eccezione, è possibile conservare informazioni sull'eccezione precedente (implicitamente o usando raise Exception from another_exception).

Queste caratteristiche forniscono un meccanismo flessibile e potente per gestire gli errori in Python, consentendo di creare programmi più affidabili e resilienti ai guasti.