背景:我正在用Python编写National Instruments测试台的COM编程。如果对象没有被正确地“释放”,TestStand会抱怨(它会弹出一个“对象没有正确释放”的调试对话框)。在Python中释放TestStand COM对象的方法是确保所有变量不再包含对象,例如del()它们,或者将它们设置为None。或者,只要变量是函数局部变量,当函数结束时,一旦变量超出范围,对象就会被释放。在
好吧,我在我的程序中遵循了这个规则,只要没有异常,我的程序就会正确地释放对象。但是如果我得到一个异常,那么我会从TestStand得到“objects not released”消息。这似乎表明,当发生异常时,函数局部变量通常不会超出范围。在
下面是一个简化的代码示例:class TestObject(object):
def __init__(self, name):
self.name = name
print("Init " + self.name)
def __del__(self):
print("Del " + self.name)
def test_func(parameter):
local_variable = parameter
try:
pass
# raise Exception("Test exception")
finally:
pass
# local_variable = None
# parameter = None
outer_object = TestObject('outer_object')
try:
inner_object = TestObject('inner_object')
try:
test_func(inner_object)
finally:
inner_object = None
finally:
outer_object = None
如图所示运行时,它显示了我的预期:
^{pr2}$
但是如果我取消了raise Exception...行的注释,我得到:Init outer_object
Init inner_object
Del outer_object
Traceback (most recent call last):
...
Exception: Test exception
Del inner_object
由于异常,inner_object被延迟删除。在
如果我取消了将parameter和local_variable都设置为None的行的注释,那么我得到了我期望的结果:Init outer_object
Init inner_object
Del inner_object
Del outer_object
Traceback (most recent call last):
...
Exception: Test exception
那么,当Python中发生异常时,函数局部变量到底会发生什么呢?它们是否被保存在某个地方,这样它们就不会像平常一样超出范围了?控制这种行为的“正确方法”是什么?在