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 ancheKeyboardInterrupteSystemExit. Evitalo salvo un motivo preciso per gestire sottoclassi diBaseException. - 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 erepr(exc)può fornire una rappresentazione più diagnostica.- Se l’output è destinato a un log, usa
logging.exception()nel gestore. Per una breve diagnosi interattiva è sufficienteprint(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.