Получение трассировки от исключений без повторного их вызова - PullRequest
4 голосов
/ 10 января 2012

Я использую Twister для создания сервера. Я также веду журнал ошибок сервера. Проблема в том, что если я позволю исключению работать по стеку, оно разорвет текущее соединение и отключит пользователя, так что, очевидно, я присоединяю голое устройство, кроме как для захвата всего остального.

Как только я что-то поймал, есть ли способ получить трассировку в виде строки, чтобы я мог сохранить ее где-нибудь / распечатать сам, не поднимая ее и не позволяя Python распечатать ее для меня после сбоя программы?

Ответы [ 4 ]

2 голосов
/ 10 января 2012

Модуль трассировки содержит некоторые вспомогательные функции для печати и проверки трассировки (для exameble, traceback.print_tb), но важно то, что сама информация трассировки сохраняется в глобальной переменной-интерпретаторе - sys.exc_traceback, onмодуль sys.

Цитирование из:

http://docs.python.org/reference/compound_stmts.html#try

Перед выполнением комплекта условия исключения сведения об исключении присваиваются трем переменным вМодуль sys: sys.exc_type получает объект, идентифицирующий исключение;sys.exc_value получает параметр исключения;sys.exc_traceback получает объект трассировки ...

Вы можете передать объект sys.exc_traceback в качестве параметра в traceback.print_tb, чтобы трассировка была распечатана на стандартный вывод в условии исключением.

1 голос
/ 10 января 2012

Попробуйте это:

import traceback, sys

try:
    # Do something that might raise an exception
    open("/does not exist",'rb')
except:
    traceback.print_exc( file=sys.stderr )
    # Or 
    traceback.print_exc( file=your_open_log_file )

Это должно сработать и напечатать полные трассы стека.

1 голос
/ 10 января 2012

Используя модуль ведения журнала , вы можете записать трассировку в файл:

import logging
logging.basicConfig(level = logging.DEBUG, filename = logfile)
logger = logging.getLogger(__name__)
try:
    1/0
except ZeroDivisionError as err:
    logger.exception(err)
0 голосов
/ 10 января 2012

Да, для этого есть модуль . Модуль traceback содержит функции для печати или форматирования информации об исключениях или для возврата необработанных кадров стека, чтобы вы могли делать с ними все, что захотите.

Однако для довольно сложного приложения я бы порекомендовал использовать систему ведения журналов вместо простых старых функций traceback. В частности, метод logging.Logger.exception запишет информацию об исключении в любое место регистрации, которое вы (или пользователь вашего программного обеспечения) настроили. Средство форматирования по умолчанию просто распечатает трассировку, как это сделал бы Python на консоли, но вы можете настроить отображение исключений в журнале, создав Formatter и переопределив метод format_exception. Ваш переопределенный метод - это место для вызова функций traceback, если они вам нужны для форматирования вывода исключений.

...