Как я могу получить объект трассировки ( sys.exc_info()[2] , такой же, как sys.exc_traceback ) в виде строки?

У меня есть функция, которая перехватывает все исключения, и я хочу получить трассировку в виде строки внутри этой функции.

Пока это не работает:

def handle_errors(error_type, error_message, error_traceback):
    """catch errors"""
    import traceback
    error = {}
    error['type'] = error_type.__name__
    error['message'] = str(error_message)
    error['file'] = os.path.split(error_traceback.tb_frame.f_code.co_filename)[1]
    error['line'] = error_traceback.tb_lineno
    error['traceback'] = repr(traceback.print_tb(error_traceback))
    ### finalise error handling and exit ###

sys.excepthook = handle_errors

Неправильная строка error['traceback']. Мне вообще нужно использовать модуль traceback?

В соответствии с другим смутно похожим вопросом я пробовал:

error['traceback'] = repr(error_traceback.print_exc())

... но это дает ошибку:

Error in sys.excepthook:
Traceback (most recent call last):
  File "xxxxxxxxxxx", line 54, in handle_errors
    error['traceback'] = repr(error_traceback.print_exc())
AttributeError: 'traceback' object has no attribute 'print_exc'

person mulllhausen    schedule 27.11.2013    source источник
comment
возможный дубликат Получить полную трассировку   -  person Paolo Casciello    schedule 27.11.2013
comment
этот вопрос не применим. я обновлю свой вопрос, объясняя, почему   -  person mulllhausen    schedule 27.11.2013
comment
Привет. Смотрите мой ответ, пожалуйста. Почему вы написали, что ваш вопрос неприменим?   -  person eyquem    schedule 12.12.2013
comment
@eyquem, потому что этот другой вопрос не касается захвата трассировки в функции excludehook. функция excludehook предоставляет кадр обратной трассировки для запроса (error_traceback), но этот другой вопрос не касается того, как использовать этот кадр.   -  person mulllhausen    schedule 13.12.2013
comment
Я не понимаю, что вы говорите из-за другого вопроса? Какой другой вопрос ??   -  person eyquem    schedule 13.12.2013
comment
Кроме того, я замечаю кое-что, чего не делал до сих пор: в определении handle_errors ссылка error['traceback'] назначается repr() для traceback.print_tb(error_traceback)), в то время как учетная запись исключения говорит, что это repr() из error_traceback.print_exc())   -  person eyquem    schedule 13.12.2013
comment
чтобы увидеть другой вопрос, о котором я говорю, нажмите на слова-ссылки «тот другой вопрос» в моем предыдущем комментарии. это тот, который вы поставили This question may already have an answer here: вверху моего исходного поста   -  person mulllhausen    schedule 14.12.2013


Ответы (2)


Используйте traceback.format_tb() вместо print_tb(), чтобы получить отформатированную трассировку стека (как список строк):

error['traceback'] = ''.join(traceback.format_tb(error_traceback))

print_tb() непосредственно выводит трассировку, поэтому в результате вы получаете None (это значение по умолчанию для любой функции Python, которая ничего явно не возвращает).

person Lukas Graf    schedule 27.11.2013
comment
Ваш ответ привел меня к точному решению. - person eyquem; 12.12.2013

traceback.format_exc([limit])
Это like print_exc(limit), но возвращает строку вместо печати в файл.

Новое в версии 2.4.

error['traceback'] = traceback.format_exc(error_traceback)
person eyquem    schedule 12.12.2013
comment
Это не работает по причинам, указанным Лукасом Г. в принятом ответе, который был опубликован раньше, чем ваш. - person andyn; 27.10.2016