Как зарегистрировать исключение 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, чтобы я мог ее зарегистрировать.
Ответы
Ответ 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