HOWTO · Python

Come stampare un'eccezione in Python

Scopri come stampare un'eccezione in Python, scegliere tra messaggio e traceback completo ed evitare errori comuni nella gestione.

In questa pagina

Usa print(exception) quando ti serve solo il messaggio di errore. Usa traceback.print_exc() dentro un blocco except attivo quando ti serve il traceback completo, inclusi file e riga che hanno generato l’errore. Gestisci tipi di eccezione specifici e usa logging invece di print() per le diagnosi da conservare.

Stampare il messaggio dell’eccezione

Cattura l’eccezione in una variabile e passala a print(). È il modo più breve per mostrare cosa è andato storto:

try:
    result = 10 / 0
except ZeroDivisionError as exc:
    print("Could not calculate result:", exc)

Output:

Could not calculate result: division by zero

L’oggetto eccezione viene convertito nel testo del messaggio. Questo esempio cattura in modo specifico ZeroDivisionError, quindi è meno probabile che nasconda un errore di programmazione indipendente. Se più errori richiedono lo stesso trattamento, elenca i tipi in una tupla, ad esempio except (TypeError, ValueError) as exc:.

Stampare il traceback completo

Il messaggio potrebbe non mostrare dove è nato l’errore. Importa il modulo integrato traceback di Python e chiama print_exc() mentre il gestore è attivo:

import traceback

try:
    values = [1, 2]
    value = values[3]
except IndexError:
    traceback.print_exc()

L’output include tipo di eccezione, messaggio, file e riga che ha fallito. Un traceback è più utile di un messaggio quando l’eccezione proviene da varie chiamate di funzione annidate.

print_exc() legge l’eccezione gestita in quel momento. Chiamarlo dopo la fine del blocco except, o senza un’eccezione attiva, non recupera un traceback precedente; può stampare NoneType: None. Mantieni la chiamata nel gestore oppure salva l’eccezione e usa print_exception() per un controllo esplicito.

Controllare esplicitamente la formattazione del traceback

traceback.print_exception() accetta un oggetto eccezione e può scrivere su uno stream scelto. È utile quando l’eccezione deve essere formattata o reindirizzata:

import sys
import traceback

try:
    int("not a number")
except ValueError as exc:
    traceback.print_exception(exc, file=sys.stdout)

Per creare testo invece di stamparlo subito, usa traceback.format_exception(exc):

import traceback

try:
    raise RuntimeError("configuration is missing")
except RuntimeError as exc:
    formatted = "".join(traceback.format_exception(exc))
    print(formatted)

Le funzioni traceback conservano per impostazione predefinita il concatenamento delle eccezioni. Una catena raise ... from ... può quindi mostrare sia l’eccezione originale sia quella nuova. Limita il traceback o disattiva il concatenamento solo se lo richiede il contratto dell’output; rimuovere il contesto rende più difficile la diagnosi.

Eccezioni personalizzate e logging

Definisci un’eccezione personalizzata quando i chiamanti devono distinguere un errore del dominio da un errore integrato. Cattura quel tipo e stampa il messaggio nello stesso modo:

class ConfigurationError(Exception):
    pass

try:
    raise ConfigurationError("API key is missing")
except ConfigurationError as exc:
    print("Configuration failed:", exc)

In un’applicazione o servizio, preferisci logging.exception() dentro il gestore. Registra messaggio e traceback attivo, e i gestori di logging possono inviarli a un file o al monitoraggio:

import logging

try:
    load_settings()
except Exception:
    logging.exception("Loading settings failed")

Sostituisci load_settings() con l’operazione che può fallire. L’esempio mostra intenzionalmente una cattura ampia di Exception a un confine di logging; la logica normale dovrebbe catturare i tipi specifici che sa gestire davvero.

Errori comuni e domande frequenti

  • Un except: senza tipo cattura anche KeyboardInterrupt e SystemExit. Evitalo salvo un motivo preciso per gestire sottoclassi di BaseException.
  • Non stampare solo un messaggio generico e poi continuare in silenzio se il programma non può produrre un risultato valido. Rilancia l’eccezione o restituisci un errore esplicito.
  • type(exc) mostra la classe concreta, str(exc) il messaggio leggibile e repr(exc) può fornire una rappresentazione più diagnostica.
  • Se l’output è destinato a un log, usa logging.exception() nel gestore. Per una breve diagnosi interattiva è sufficiente print(exc).
  • traceback.print_exc() riguarda l’eccezione gestita in quel momento; traceback.print_exception(exc) è più chiaro quando conservi l’oggetto e devi controllare formato o output.

Questi modelli usano il meccanismo integrato delle eccezioni di Python e non richiedono pacchetti di terze parti. La scelta dipende dal fatto che servano un messaggio, il percorso completo delle chiamate, testo formattato o logging duraturo dell’applicazione.