在Python中相当于e.printStackTrace

我知道print(e) (其中e是一个Exception)打印发生的exception,但是,我试图findJava的e.printStackTrace()的python等价物,它精确地追踪发生exception的exception,并打印整个跟踪的。

任何人都可以告诉我相当于Python中的e.printStackTrace()吗?

 import traceback traceback.print_exc() 

except ...: block except ...:它会自动使用当前的exception。 有关更多信息,请参阅http://docs.python.org/library/traceback.html

还有logging.exception

 import logging ... try: g() except Exception as ex: logging.exception("Something awful happened!") # will print this message followed by traceback 

输出:

 ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened! Traceback (most recent call last): File "b.py", line 22, in f g() File "b.py", line 14, in g 1/0 ZeroDivisionError: integer division or modulo by zero 

(从http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/通过如何打印完整的回溯没有停止该计划?; )

在Python中相当于e.printStackTrace

在Java中,这样做( 文档 ):

 public void printStackTrace() 

打印这个throwable和它的backtrace到标准的错误stream…

这是这样使用的:

 try { // code that may raise an error } catch (IOException e) { // exception handling e.printStackTrace(); } 

在Java中, 标准错误stream是无缓冲的,因此输出立即到达。

Python 2中的相同语义是:

 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

在Python 3中,我们可以直接从exception对象中获取回溯(对于线程代码,这可能会更好)。 另外, stderr是行缓冲的 ,但是print函数得到了一个flush参数,所以这会立即打印到stderr:

  print(traceback.format_exception(None, # <- type(e) by docs, but ignored e, e.__traceback__), file=sys.stderr, flush=True) 

结论:

因此,在Python 3中, traceback.print_exc()虽然默认情况下使用sys.stderr ,但会缓冲输出,您可能会丢失它。 因此,为了获得尽可能等效的语义,在Python 3中,使用printflush=True