e.printStackTrace эквивалент в Python - PullRequest
185 голосов
/ 04 марта 2012

Я знаю, что print(e) (где e - исключение) печатает возникшее исключение, но я пытался найти Python-эквивалент Java e.printStackTrace(), который точно отслеживает исключение в той строке, в которой оно произошло, и печатает всю трассировкуоб этом.

Может кто-нибудь сказать, пожалуйста, эквивалент e.printStackTrace() в Python?

Ответы [ 3 ]

259 голосов
/ 04 марта 2012
import traceback
traceback.print_exc()

При выполнении этого внутри блока except ...: будет автоматически использоваться текущее исключение.См. http://docs.python.org/library/traceback.html для получения дополнительной информации.

105 голосов
/ 07 мая 2013

Существует также 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/ до Как напечатать полный обратный просмотр без остановкипрограмма? )

16 голосов
/ 20 июля 2015

e.printStackTrace эквивалент в python

В Java это делает следующее ( docs ):

public void printStackTrace()

Печатает этот throwable и его обратную трассировку в стандартный поток ошибок ...

Это используется так:

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

В 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.

Python 3

В Python 3мы можем получить трассировку непосредственно от объекта исключения (который, вероятно, ведет себя лучше для многопоточного кода).Кроме того, stderr буферизируется по строке , но функция печати получает аргумент сброса, поэтому он будет немедленно напечатан в 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.

...