e.printStackTrace еквівалент у python


207

Я знаю, що print(e)(де e - виняток) друкує виняток, що стався, але я намагався знайти еквівалент python Java, e.printStackTrace()який точно простежує виняток до того, до якого рядка він стався, і друкує весь його слід.

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

Відповіді:


280
import traceback
traceback.print_exc()

Роблячи це всередині except ...:блоку, він автоматично використовуватиме поточний виняток. Для отримання додаткової інформації див. Http://docs.python.org/library/traceback.html .


10
Якщо ви працюєте всередині такого типу контейнера, як Jython, і тому не можете просто надрукувати слід, format_excнатомість ви можете отримати рядок.
SeldomNeedy

116

Є також 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()?
Натан

18

e.printStackTrace еквівалент у python

У Java це робить наступне ( документи ):

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.

Пітон 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.


3

Додавання інших великих відповідей, ми можемо використовувати в Python loggingбібліотечної debug(), info(), warning(), error()і critical()методу. Цитуючи з документів для 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.