2016-07-06 7 views
1

sys.exc_info() возвращает кортеж (тип, значение, трассировка).
поэтому sys.exc_info()[2] - наш отслеживание объект.Почему exc_traceback возвращает None

Почему не ловит исключения отслеживающих с этим кодом:

import sys 

try: 
    1/0 
except ZeroDivisionError: 
    print sys.exc_info()[2].tb_frame.f_back 

tb_frame и использование f_back были объяснены здесь: Frame Objects

+1

У него есть трассировка, иначе вы получите 'AttributeError', но кадр трассировки не имеет' f_back'. Это кажется мне совершенно разумным. Если вы используете это прямо, * какой внешний фрейм вы ожидали? * – jonrsharpe

+0

в строке 269 traceback.py в стандартной библиотеке то же самое: tb_frame.f_back. – Heartagramir

+0

Это не отвечает на мой вопрос. * Почему вы думаете, что в этом случае будет внешний кадр *? – jonrsharpe

ответ

2

Вы видите None потому что нет внешней рамки. Вы выполняете это напрямую, поэтому текущий кадр - это последний кадр. Чтобы продемонстрировать это, я создал demo.py:

import sys 

try: 
    1/0 
except ZeroDivisionError: 
    print sys.exc_info()[2].tb_frame.f_back 

, который должен выглядеть знакомым, и тривиальное caller.py:

import demo 

Теперь увидеть разницу:

$ python demo.py 
None 

$ python caller.py 
<frame object at 0x10bc34c20> 

Во втором случае, где есть внешний кадр (то есть caller.py), вы не видите None.

+0

хорошо ваш комментарий больше походил на решение ... мой вопрос был результатом моего отсутствия знаний о кадрах. теперь я узнаю фрейм более четко ... Я предлагаю отредактировать ваше решение и добавить некоторую информацию о использовании фреймов и f_back в других фреймах. – Heartagramir

+0

@Heartagramir что именно делает * "добавить некоторую информацию о использовании фрейма и f_back в других фреймах" * означает? У вас есть конкретный вопрос, на который я мог бы ответить? Что непонятно? – jonrsharpe

+0

Все ясно для меня, это было просто предложение спасибо снова. – Heartagramir

Смежные вопросы