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

Как зарегистрировать исключение python?

Как я могу регистрировать исключение в Python?

Я просмотрел некоторые параметры и выяснил, что могу получить доступ к фактическим данным о деталях с помощью этого кода:

import sys
import traceback

try:
    1/0
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    traceback.print_exception(exc_type, exc_value, exc_traceback)

Я хотел бы как-то получить строку print_exception() throws to stdout, чтобы я мог ее зарегистрировать.

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос, вы можете получить строчную версию print_exception() с помощью функции traceback.format_exception(). Он возвращает сообщение трассировки как список строк, а не печатает его на stdout, поэтому вы можете делать то, что хотите. Например:

import sys
import traceback

try:
    asdf
except NameError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
    print ''.join('!! ' + line for line in lines)  # Log it or whatever here

Отображается:

!! Traceback (most recent call last):
!!   File "<stdin>", line 2, in <module>
!! NameError: name 'asdf' is not defined

Однако я бы определенно рекомендовал использовать стандартный модуль протоколирования Python, как это было предложено rlotun. Это не самая простая настройка, но она очень настраиваемая.

Ответ 2

Взгляните на logging.exception (Модуль регистрации Python)

import logging 
def foo():
    try:
        some_code()
    except:
        logging.exception('')

Это должно автоматически позаботиться о том, чтобы получить трассировку для текущего исключения и правильно зарегистрировать его.

Ответ 3

Исключения журналов так же просто, как добавление аргумента exc_info = True в любое сообщение журнала, см. запись для Logger.debug в http://docs.python.org/2/library/logging.html.

Пример:

try: 
    raise Exception('lala')
except Exception:
    logging.info('blah', exc_info=True)

(зависит, конечно, от конфигурации вашего обработчика журнала):

2012-11-29 10:18:12,778 - root - INFO - <ipython-input-27-5af852892344> : 3 - blah
Traceback (most recent call last):
  File "<ipython-input-27-5af852892344>", line 1, in <module>
    try: raise Exception('lala')
Exception: lala

Ответ 4

В Python 3.5 вы можете передать экземпляр исключения в аргумент exc_info:

import logging
try:
    1/0
except Exception as e:
   logging.error('Error at %s', 'division', exc_info=e)

Ответ 5

Прежде всего, рассмотрите использование правильного типа Exception в предложении except. Затем, называя исключение, вы можете его распечатать:

try:
    1/0
except Exception as e:
    print e

В зависимости от вашей версии Python вы должны использовать

except Exception, e