在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
在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中,使用print
和flush=True
。