5.1 Modulo traceback
Traceback (traceback)
— è un'informazione che mostra
la sequenza di chiamate a funzioni che ha portato alla generazione
di un'eccezione. È uno strumento importante per il debug, poiché aiuta
gli sviluppatori a capire dove e perché si è verificato un errore.
L'analisi del traceback (traceback)
— è una parte importante del debug dei programmi,
consentendo agli sviluppatori di capire dove e perché si è verificato un errore. Python
fornisce il modulo traceback
che contiene funzioni per lavorare con tracce dello stack. Questo modulo
permette di estrarre, formattare e visualizzare informazioni sul traceback.
Ottenere e lavorare con il traceback
Per lavorare con il traceback, bisogna importare il modulo
traceback
che offre funzioni per formattare e
visualizzare informazioni sulla traccia dello stack.
Esempio di ottenimento e visualizzazione del traceback:
import traceback
def function_c():
return 1 / 0 # Questo genererà ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("È avvenuta un'eccezione:")
traceback.print_exc() # Stampa il traceback
function_a()
Output:
È avvenuta un'eccezione:
Traceback (most recent call last):
File "example.py", line 12, in function_a
function_b()
File "example.py", line 8, in function_b
function_c()
File "example.py", line 4, in function_c
return 1 / 0
ZeroDivisionError: division by zero
Funzione traceback.print_exc()
Questa funzione stampa il traceback dell'eccezione corrente nel flusso di errore standard.
Esempio:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
Funzione traceback.format_exc()
Questa funzione restituisce una stringa con il traceback formattato dell'eccezione corrente.
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("Traceback ottenuto come stringa:")
print(error_message)
Funzione traceback.extract_tb(tb)
Questa funzione estrae informazioni "raw" sulla traccia dello stack dall'oggetto
della traccia (traceback object)
, ottenibile tramite sys.exc_info()
.
Restituisce una lista di frame dello stack.
5.2 Gestione e analisi del traceback
Funzione traceback.format_tb(tb)
Questa funzione restituisce una lista formattata di stringhe che rappresentano la traccia dello stack.
import sys
import traceback
def function_c():
return 1 / 0 # Questo genererà ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError:
tb = sys.exc_info()[2]
formatted_tb = traceback.format_tb(tb)
print("Traceback formattato:")
for line in formatted_tb:
print(line, end="")
function_a()
Funzione traceback.format_exception(exc_type, exc_value, exc_tb)
Questa funzione restituisce una lista completa e formattata di stringhe che rappresentano l'eccezione e la traccia dello stack.
import sys
import traceback
def function_c():
return 1 / 0 # Questo genererà ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
print("Traceback completo formattato:")
for line in full_tb:
print(line, end="")
function_a()
A volte è utile analizzare più dettagliatamente ogni frame dello stack, per ottenere informazioni specifiche sul punto in cui si è verificata l'eccezione e sul contesto di quel punto.
import traceback
import sys
def function_c():
return 1 / 0 # Questo genererà ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError:
tb = sys.exc_info()[2]
for frame in traceback.extract_tb(tb):
print(f"File: {frame.filename}")
print(f"Linea: {frame.lineno}")
print(f"Nome della funzione: {frame.name}")
print(f"Testo: {frame.line}")
print("-" * 40)
function_a()
5.3 Uso di traceback
per il log
A volte è importante salvare le informazioni sul traceback in un file di log per un'analisi successiva. Questo è possibile utilizzando le funzioni
del modulo traceback
e il
modulo logging
standard.
Esempio:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # Questo genererà ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
logging.error("È avvenuta un'eccezione:\n%s", ''.join(full_tb))
function_a()
Il logging lo vedremo un po' più avanti, ma penso che queste informazioni siano state utili.
GO TO FULL VERSION