5.1 Módulo traceback
Traceback — é a informação que mostra a sequência de chamadas de funções que levaram à ocorrência de uma exceção. É uma ferramenta importante para depuração, pois ajuda os desenvolvedores a entenderem onde e por que ocorreu um erro.
Analisar o traceback é uma parte importante da depuração de programas, permitindo aos desenvolvedores entender onde e por que ocorreu um erro. O Python fornece o módulo traceback
, que contém funções para trabalhar com tracebacks. Este módulo permite extrair, formatar e exibir informações sobre o traceback.
Obtendo e trabalhando com traceback
Para trabalhar com traceback, você precisa importar o módulo traceback
, que fornece funções para formatar e exibir informações sobre a rastreamento de pilha.
Exemplo de obtenção e saída de traceback:
import traceback
def function_c():
return 1 / 0 # Isso vai gerar um ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("Aconteceu uma exceção:")
traceback.print_exc() # Imprime o traceback
function_a()
Saída:
Aconteceu uma exceção:
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
Função traceback.print_exc()
Esta função imprime o traceback da exceção atual no fluxo padrão de erros.
Exemplo:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
Função traceback.format_exc()
Esta função retorna uma string com o traceback formatado da exceção atual.
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("Traceback obtido como string:")
print(error_message)
Função traceback.extract_tb(tb)
Esta função extrai informações "cruas" sobre o rastreamento de pilha a partir de um objeto de traceback, que pode ser obtido através de sys.exc_info()
.
Retorna uma lista de frames de pilha.
5.2 Manipulação e análise de traceback
Função traceback.format_tb(tb)
Esta função retorna uma lista formatada de strings que representam o rastreamento de pilha.
import sys
import traceback
def function_c():
return 1 / 0 # Isso vai gerar um 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 formatado:")
for line in formatted_tb:
print(line, end="")
function_a()
Função traceback.format_exception(exc_type, exc_value, exc_tb)
Esta função retorna uma lista completa de strings formatadas que representam a exceção e o rastreamento de pilha.
import sys
import traceback
def function_c():
return 1 / 0 # Isso vai gerar um 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 formatado:")
for line in full_tb:
print(line, end="")
function_a()
Às vezes, é útil analisar cada frame da pilha em mais detalhes para obter informações específicas sobre o local onde a exceção ocorreu e o contexto desse local.
import traceback
import sys
def function_c():
return 1 / 0 # Isso vai gerar um 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"Arquivo: {frame.filename}")
print(f"Linha: {frame.lineno}")
print(f"Nome da função: {frame.name}")
print(f"Texto: {frame.line}")
print("-" * 40)
function_a()
5.3 Usando traceback
para logging
Às vezes, é importante salvar informações de traceback em um arquivo de log para análise posterior. Isso pode ser feito usando as funções do módulo traceback
e o módulo logging
padrão.
Exemplo:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # Isso vai gerar um 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("Ocorreu uma exceção:\n%s", ''.join(full_tb))
function_a()
Veremos um pouco mais sobre logging mais adiante, mas espero que essa informação tenha sido útil para você.
GO TO FULL VERSION