@alex_les

Почему не виден полный стек исключений?

Мне нужна функция, перехватывающая стек исключений. Однако оказалось, что простой способ типа
try:
    raising_func()
except Exception:
    _, _, tb = sys.exc_info()

работает, только если его явно прописать, а вызванный из функции вот таким образом
#перехватывающая функция
   def stack_capture(func):
       try:
           func()
       except Exception:
           _, _, tb = sys.exc_info()
       return tb

#вызов
def some_function()
    my_tb = stack_capture(raising_func)

возвращает только верхнее исключение, возникшее внутри самой stack_capture(). Отчего так происходит и можно ли получить весь стек?
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
@galaxy
возвращает только верхнее исключение, возникшее внутри самой stack_capture(). Отчего так происходит и можно ли получить весь стек?

Вообще-то оно возвращает Traceback object.
Этот объект содержит поля tb_frame (типа Frame object), tb_lineno (номер строки в коде), tb_lasti (номер инструкции в байт коде) и tb_next - ссылка на следующий по порядку объект типа Traceback.
Хотите развернуть трейс - проходите по списку:
my_tb = stack_capture(raising_func)
    t = my_tb
    while t:
        print(t.tb_frame, t.tb_lineno, t.tb_lasti)
        t = t.tb_next
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы