ethon中的e.printStackTrace等价物

koo*_*ool 193 python java exception stack-trace

我知道print(e)(其中e是异常)打印发生的异常但是,我试图找到相当于Java的python,e.printStackTrace()它确切地追踪它发生的行的异常并打印出它的整个痕迹.

有谁能告诉我相当于e.printStackTrace()Python?

Thi*_*ter 267

import traceback
traceback.print_exc()
Run Code Online (Sandbox Code Playgroud)

except ...:块内执行此操作时,它将自动使用当前异常.有关更多信息,请参阅http://docs.python.org/library/traceback.html.

  • 如果你在[Jython](http://www.jython.org/)这样的容器内工作,因此不能只打印跟踪,你可以[`format_exc`](https://docs.python .org/3/library/traceback.html#traceback.format_exc)而不是获取字符串. (7认同)

dav*_*one 110

还有logging.exception.

import logging

...

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

输出:

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
Run Code Online (Sandbox Code Playgroud)

(来自http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/通过如何打印完整的追溯而不用停止该计划?)

  • 最大的优点是您可以通过配置记录器来控制您想要查看的内容/位置。例如,您可以使用它将日志发送到生产中的日志服务,以便更轻松地修复难以重现的问题。 (3认同)
  • 与“traceback.print_exc()”相比,它的优点/缺点是什么? (2认同)

Aar*_*all 16

ethon中的e.printStackTrace等价物

在Java中,这将执行以下(docs):

public void printStackTrace()
Run Code Online (Sandbox Code Playgroud)

将此throwable及其回溯打印到标准错误流...

这是这样使用的:

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

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

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.
Run Code Online (Sandbox Code Playgroud)

Python 3

在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)
Run Code Online (Sandbox Code Playgroud)

结论:

因此,在Python 3中,traceback.print_exc()虽然它sys.stderr 默认使用,但会缓冲输出,并且您可能会丢失它.因此,要获得等同的语义可能,在Python 3,使用printflush=True.


Mik*_*eyE 7

添加到其他伟大的答案,我们可以使用Pythonlogging库的debug()info()warning()error(),和critical()方法。引用Python 3.7.4的文档,

在 kwargs 中检查了三个关键字参数: exc_info 如果它不评估为 false,则会导致将异常信息添加到日志消息中。

这意味着,您可以使用 Pythonlogging库输出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)
Run Code Online (Sandbox Code Playgroud)

它会输出:

'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'
Run Code Online (Sandbox Code Playgroud)

  • `logger.error(str(e), exc_info=True)` 可以更好地表达为 `logger.exception()` (3认同)