equivalente ao e.printStackTrace em python
Em Java, isso faz o seguinte ( docs ):
public void printStackTrace()
Imprime este lançamento e seu retorno ao fluxo de erros padrão ...
Isso é usado assim:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
Em Java, o fluxo de erro padrão é sem buffer, para que a saída chegue imediatamente.
As mesmas semânticas no Python 2 são:
import traceback
import sys
try: # code that may raise an error
pass
except IOError as e: # exception handling
# in Python 2, stderr is also unbuffered
print >> sys.stderr, traceback.format_exc()
# in Python 2, you can also from __future__ import print_function
print(traceback.format_exc(), file=sys.stderr)
# or as the top answer here demonstrates, use:
traceback.print_exc()
# which also uses stderr.
Python 3
No Python 3, podemos obter o traceback diretamente do objeto de exceção (que provavelmente se comporta melhor para o código encadeado). Além disso, o stderr possui buffer de linha , mas a função print recebe um argumento de liberação, portanto isso seria imediatamente impresso no stderr:
print(traceback.format_exception(None, # <- type(e) by docs, but ignored
e, e.__traceback__),
file=sys.stderr, flush=True)
Conclusão:
Portanto, no Python 3, traceback.print_exc()
embora seja usado sys.stderr
por padrão , o buffer será armazenado em buffer e você poderá perdê-lo. Portanto, para obter a semântica o mais equivalente possível, no Python 3, use print
com flush=True
.
format_exc
obter uma sequência.