2010-06-08 60 views
2

在Python,我有一些代码捕获异常,例如:的Python:sys.exc_info()缺少局部变量

try: 
    <do stuff> 
except: 
    exc_info = sys.exc_info() 

我遇到的问题是,回溯对象(exc_info [ 2])在追踪对象中非确定性地缺少局部变量。我知道这是事实,因为我运行完全相同的代码,有时变量位于tb.tb_frame.f_locals中,有时不是。全局变量在tb.tb_frame.f_globals中总是正确的。

什么是填充f_locals结构?什么可能导致局部变量字典有时是空的?

+1

这听起来像你的代码中必须有一些非确定性。主题?网络I/O?什么? – 2010-06-08 22:41:37

+1

我同意奈德; tb_frame实际上是调用代码的框架,如果变量不存在,那么它不会被设置。那么请注意,重新提出的异常会保留它们的tb对象,所以也许框架并未指向您认为的范围? – 2010-06-09 04:22:31

回答

0

什么是在当地人是完全依赖于在该地方上下文中的代码。例如:

if condition: 
    foo='foo' 
else: 
    bar='bar' 

如果condition==True然后foo将在locals()bar不会,否则bar将在locals()foo不会。