Answers:
import traceback
traceback.print_exc()
在一个except ...:
块内执行此操作时,它将自动使用当前异常。有关更多信息,请参见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/通过如何打印完整的回溯而无需暂停程序?)
traceback.print_exc()
?
相当于e.printStackTrace的python
在Java中,这将执行以下操作(docs):
public void printStackTrace()
将这个throwable及其回溯打印到标准错误流中。
这样使用:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
在Java中,标准错误流没有缓冲,因此输出立即到达。
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中,我们可以直接从异常对象获取回溯(对于线程代码,其行为可能更好)。另外,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
。
添加到其他伟大的答案,我们可以使用Python logging
库的debug()
,info()
,warning()
,error()
,和critical()
方法。引用Python 3.7.4的文档,
在kwargs中检查了三个关键字参数:exc_info,如果不将其评估为false,则会将异常信息添加到日志消息中。
这意味着,您可以使用Python logging
库输出debug()
或其他类型的消息,并且该logging
库将在其输出中包括堆栈跟踪。考虑到这一点,我们可以执行以下操作:
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def f():
a = { 'foo': None }
# the following line will raise KeyError
b = a['bar']
def g():
f()
try:
g()
except Exception as e:
logger.error(str(e), exc_info=True)
它将输出:
'bar'
Traceback (most recent call last):
File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
g()
File "<ipython-input-2-8ae09e08766b>", line 14, in g
f()
File "<ipython-input-2-8ae09e08766b>", line 10, in f
b = a['bar']
KeyError: 'bar'
format_exc
获取字符串。