Подтвердить что ты не робот

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

Я знаю, что print(e) (где e is Exception) печатает возникшее исключение но я пытался найти эквивалент python для Java e.printStackTrace(), который точно отслеживает исключение в той строке, в которой он произошел, и печатает весь его след.

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

4b9b3361

Ответ 1

import traceback
traceback.print_exc()

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

Ответ 2

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

Ответ 3

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

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

public void printStackTrace()

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

Это используется следующим образом:

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 является строковым буфером, но функция печати получает аргумент 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.

Ответ 4

В дополнение к другим замечательным ответам, мы можем использовать методы debug(), info(), warning(), error() и critical() библиотеки Python для logging. Цитирование из документации по Python 3.7.4,

В kwargs есть три ключевых аргумента, которые проверяются: exc_info, который, если он не оценивается как ложный, приводит к добавлению информации об исключении в сообщение регистрации.

Это означает, что вы можете использовать библиотеку logging Python для вывода сообщений 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'