【问题标题】:Why exc_traceback returns None为什么 exc_traceback 返回 None
【发布时间】:2016-07-06 10:46:51
【问题描述】:

sys.exc_info() 返回一个元组(类型、值、回溯)。
所以sys.exc_info()[2] 是我们的回溯对象。

为什么它不使用此代码捕获异常回溯:

import sys

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

tb_frame 和 f_back 的用法已在此处解释: Frame Objects

【问题讨论】:

  • 它确实有一个回溯,否则你会得到一个AttributeError,但回溯的框架没有f_back。这对我来说似乎非常明智。如果您直接运行它,您期望的外框是什么?
  • 在标准库中的第 269 行 traceback.py 模块中相同:使用了 tb_frame.f_back。
  • 这并不能真正回答我的问题。 你为什么认为会有一个外框,在这种情况下?
  • @Heartagramir 那是因为该代码在 print_stack 函数内,我们需要上一帧,因为我们对 print_stack 函数自己的帧并不真正感兴趣。

标签: python exception sys traceback


【解决方案1】:

您会看到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

【讨论】:

  • 好吧,您的评论更像是解决方案……我的问题是由于我缺乏对框架的了解。现在我更清楚地了解了框架......我建议编辑你的解决方案并添加一些关于框架和 f_back 在其他框架中使用的信息。
  • @Heartagramir "add some information about frame and f_back usage in other frames"究竟是什么意思?你有一个具体的问题我可以回答吗?什么不清楚?
  • 对我来说一切都很清楚,这只是一个建议,再次感谢。
  • @Heartagramir 没问题;如果您有具体建议,请告诉我,但我不会继续写,希望对您有所帮助!
猜你喜欢
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2015-06-18
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多