为什么 traceback.extract_stack() 在确实有调用栈时返回 []?

0 投票
3 回答
513 浏览
提问于 2025-04-15 13:29

我有一个类,在它的 __init__() 方法里调用了

traceback.extract_stack()

但是每次我这么做的时候,traceback.extract_stack() 的值都是 [],也就是空的。

这可能有什么原因呢?有没有其他更可靠的方法来获取错误追踪信息?

我觉得问题出在 Pylons 上。这里有一些控制器动作的代码:

def test_tb(self):
    import traceback
    return a.lib.htmlencode(traceback.extract_stack())

它生成的网页内容就是

[] 

所以,我觉得这和在对象的构造函数里没什么关系。难道这可能和某些线程类型与 traceback 模块不兼容有关吗?

3 个回答

0

原因是有人在这个项目上启用了Pysco,而Pysco和traceback模块不太兼容。

0

看看 traceback 模块的代码,有一种可能是你把 sys.tracebacklimit 设置成了零,不过这听起来不太可能...

1

下面的内容展示了如何在一个类的 __init__ 方法中使用 traceback.extract_stack()。如果你觉得它不工作,请把你的代码发出来,并告诉我你用的 Python 版本。不要凭记忆输入,像我这样复制粘贴。

Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import traceback as tb
>>> tb.extract_stack()
[('<stdin>', 1, '<module>', None)]
>>> def func():
...     print tb.extract_stack()
...
>>> func()
[('<stdin>', 1, '<module>', None), ('<stdin>', 2, 'func', None)]
>>> class Klass(object):
...     def __init__(self):
...         print tb.extract_stack()
...
>>> k = Klass()
[('<stdin>', 1, '<module>', None), ('<stdin>', 3, '__init__', None)]
>>>

更新:与其直接看 return a.lib.htmlencode(traceback.extract_stack()) 而感到困惑,不如深入了解一下这个过程:

(1) 先执行 tb_stack = repr((traceback.extract_stack()),然后把结果写到你的日志文件里,以便检查。

(2) 再执行 return a.lib.htmlencode(some_known_constant_data),确认你预期的数据是否正确显示。

撰写回答