5.1 Módulo traceback
Stack Trace (traceback)
- es información que muestra
la secuencia de llamadas de funciones que llevó a la ocurrencia de
una excepción. Es una herramienta importante para la depuración, ya que ayuda
a los desarrolladores a entender dónde y por qué ocurrió un error.
El análisis del stack trace (traceback)
es una parte importante de la depuración de programas,
permitiendo a los desarrolladores entender dónde y por qué ocurrió un error. Python
proporciona el módulo traceback
, que contiene funciones para trabajar con rastreos de pila. Este módulo
permite extraer, formatear y mostrar información sobre el stack trace.
Obtención y trabajo con stack trace
Para trabajar con stack trace necesitas importar el módulo
traceback
, que proporciona funciones para formatear y
mostrar información sobre trazas de pila.
Ejemplo de obtención y salida de stack trace:
import traceback
def function_c():
return 1 / 0 # Esto generará ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("Ocurrió una excepción:")
traceback.print_exc() # Imprime el stack trace
function_a()
Salida:
Ocurrió una excepción:
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
Función traceback.print_exc()
Esta función imprime el stack trace de la excepción actual al flujo estándar de errores.
Ejemplo:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
Función traceback.format_exc()
Esta función devuelve una cadena con el stack trace formateado de la excepción actual.
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("Stack trace obtenido como cadena:")
print(error_message)
Función traceback.extract_tb(tb)
Esta función extrae información "cruda" sobre el rastreo de pila desde el objeto
de rastreo (traceback object)
, que se puede obtener a través de sys.exc_info()
.
Devuelve una lista de marcos de pila.
5.2 Manejo y análisis de stack trace
Función traceback.format_tb(tb)
Esta función devuelve una lista formateada de cadenas que representan el stack trace.
import sys
import traceback
def function_c():
return 1 / 0 # Esto generará 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("Stack trace formateado:")
for line in formatted_tb:
print(line, end="")
function_a()
Función traceback.format_exception(exc_type, exc_value, exc_tb)
Esta función devuelve una lista completa y formateada de cadenas que representan la excepción y el stack trace.
import sys
import traceback
def function_c():
return 1 / 0 # Esto generará 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("Stack trace completamente formateado:")
for line in full_tb:
print(line, end="")
function_a()
A veces es útil analizar más detalladamente cada marco de pila para obtener información específica sobre el lugar donde ocurrió la excepción y el contexto de ese lugar.
import traceback
import sys
def function_c():
return 1 / 0 # Esto generará 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"Archivo: {frame.filename}")
print(f"Línea: {frame.lineno}")
print(f"Nombre de la función: {frame.name}")
print(f"Texto: {frame.line}")
print("-" * 40)
function_a()
5.3 Uso de traceback
para logging
A veces es importante guardar la información del stack trace en un archivo de log para un
análisis posterior. Esto se puede hacer utilizando las funciones del
módulo traceback
y el
módulo estándar logging
.
Ejemplo:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # Esto generará 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("Ocurrió una excepción:\n%s", ''.join(full_tb))
function_a()
El logging lo veremos un poco más adelante, pero creo que esta información te fue útil.
GO TO FULL VERSION