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

Почему я не могу раскрыть ошибку Traceback в Python?

С тех пор я нашел работу, но все еще хочу знать ответ.

4b9b3361

Ответ 1

Трассировка содержит ссылки на фреймы стека для каждой функции/метода, которая была вызвана в текущем потоке, от верхнего кадра до точки, где была поднята ошибка. Каждый кадр стека также содержит ссылки на локальные и глобальные переменные, действующие в момент вызова каждой функции в стеке.

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

Одним из решений является создание picklable объекта для отслеживания трассировки и извлечение только информации, необходимой для сохранения.

Ответ 2

Я думаю, вы заинтересованы в сохранении полного контекста вызова ( трассировка + глобальных + локальных каждого кадра).

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

Проблема заключается в том, что pickl не знает, как сериализовать все типы объектов, которые могут находиться в локалях или глобальных.

Я думаю, вы можете создать свой собственный объект и сохранить его, отфильтровывая все те объекты, которые не являются picklabe. Этот код может служить основой:

import sys, traceback

def print_exc_plus():
    """
    Print the usual traceback information, followed by a listing of all the
    local variables in each frame.
    """
    tb = sys.exc_info()[2]
    while 1:
        if not tb.tb_next:
            break
        tb = tb.tb_next
    stack = []
    f = tb.tb_frame
    while f:
        stack.append(f)
        f = f.f_back
    stack.reverse()
    traceback.print_exc()
    print "Locals by frame, innermost last"
    for frame in stack:
        print
        print "Frame %s in %s at line %s" % (frame.f_code.co_name,
                                             frame.f_code.co_filename,
                                             frame.f_lineno)
        for key, value in frame.f_locals.items():
            print "\t%20s = " % key,
            #We have to be careful not to cause a new error in our error
            #printer! Calling str() on an unknown object could cause an
            #error we don't want.
            try:                   
                print value
            except:
                print "<ERROR WHILE PRINTING VALUE>"

но вместо того, чтобы печатать объекты, вы можете добавить их в список со своим собственным выбираемым представлением (лучше json или yml).

Возможно, вы хотите загрузить весь этот контекст вызова, чтобы воспроизвести ту же ситуацию для своей функции, не запуская сложный рабочий процесс, который ее генерирует. Я не знаю, можно ли это сделать (из-за ссылок на память), но в этом случае вам придется де-сериализовать его из вашего формата.