为什么 traceback.extract_stack() 在确实有调用栈时返回 []?
我有一个类,在它的 __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)
,确认你预期的数据是否正确显示。