Eu já vi muitas postagens sobre rastreamento de pilha e exceções no Python. Mas não encontrei o que eu preciso.
Eu tenho um pedaço de código Python 2.7 que pode gerar uma exceção. Gostaria de pegá-lo e atribuir a uma string sua descrição completa e o rastreamento da pilha que causou o erro (simplesmente tudo o que usamos para ver no console). Eu preciso dessa string para imprimi-la em uma caixa de texto na GUI.
Algo assim:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
O problema é: qual é a função complete_exception_description
?
log_error(err)
função.Vamos criar um stacktrace decentemente complicado, para demonstrar que temos o stacktrace completo:
Registrando o StackTrace Completo
Uma prática recomendada é ter um criador de logs configurado para o seu módulo. Ele saberá o nome do módulo e poderá alterar os níveis (entre outros atributos, como manipuladores)
E podemos usar esse logger para obter o erro:
Quais logs:
E assim obtemos a mesma saída que quando temos um erro:
Obtendo apenas a string
Se você realmente deseja apenas a string, use a
traceback.format_exc
função, demonstrando o registro da string aqui:Quais logs:
fonte
except Exception as e: logger.exception("<<clearly and distinctly describe what failed here>>", exc_info=e)
exc_info
argumento espera uma "tupla de exceção", enquanto theerror
é uma instância doException
objeto (ou subclasse) e não há necessidade de mudarerror
parae
.Com o Python 3, o código a seguir formatará um
Exception
objeto exatamente como seria obtido usandotraceback.format_exc()
:A vantagem é que apenas o
Exception
objeto é necessário (graças ao__traceback__
atributo gravado ) e, portanto, pode ser passado mais facilmente como argumento para outra função para processamento adicional.fonte
.__traceback__
etype
, veja stackoverflow.com/a/58764987/5717886Você usa sys.exc_info () para coletar as informações e as funções no
traceback
módulo para formatá-las. Aqui estão alguns exemplos para formatá-lo.Toda a cadeia de exceção está em:
fonte
Para aqueles que usam Python-3
O uso do
traceback
módulo eexception.__traceback__
um pode extrair o rastreamento de pilha da seguinte maneira:traceback.extract_stack()
__traceback__
objeto de exceção usandotraceback.extract_tb()
traceback.format_list()
Uma demonstração simples:
Obtemos a seguinte saída quando chamamos
bar()
:fonte
Você também pode considerar usar o módulo Python embutido , cgitb , para obter algumas informações de exceção realmente boas e bem formatadas, incluindo valores de variáveis locais, contexto do código fonte, parâmetros de função etc.
Por exemplo, para este código ...
obtemos essa saída de exceção ...
fonte
Se você deseja obter as mesmas informações fornecidas quando uma exceção não é tratada, você pode fazer algo assim. Faça
import traceback
e depois:Estou usando o Python 3.7.
fonte
Para Python 3.5+ :
Portanto, você pode obter o rastreamento de pilha da sua exceção e de qualquer outra exceção. Use
traceback.TracebackException
para isso (basta substituirex
por sua exceção):Um exemplo estendido e outros recursos para fazer isso:
A saída será algo como isto:
fonte
meus 2 centavos:
fonte
Se seu objetivo é fazer com que a mensagem de exceção e de rastreamento de pilha seja exatamente como quando o python gera um erro, o seguinte funciona no python 2 + 3:
Funciona removendo a última
format_stacktrace()
chamada da pilha e juntando-se ao restante. Quando executado, o exemplo acima fornece a seguinte saída:fonte
Eu defini a seguinte classe auxiliar:
Que mais tarde posso usar assim:
E depois pode consumi-lo assim:
(Antecedentes: fiquei frustrado por usar
Promise
s junto comException
s, que infelizmente passa exceções geradas em um local para um manipulador on_rejected em outro local e, portanto, é difícil obter o retorno do local original)fonte