【发布时间】:2010-01-13 09:30:22
【问题描述】:
背景:我正在用 Python 对 National Instruments 的 TestStand 进行 COM 编程。如果对象未正确“释放”,TestStand 会抱怨(它会弹出“对象未正确释放”调试对话框)。在 Python 中释放 TestStand COM 对象的方法是确保所有变量不再包含该对象——例如del() 它们,或将它们设置为 None。或者,只要变量是函数局部变量,当函数结束时,只要变量超出范围,对象就会被释放。
好吧,我在我的程序中遵循了这条规则,只要没有异常,我的程序就会正确释放对象。但是,如果我得到一个异常,那么我会从 TestStand 收到“对象未释放”消息。这似乎表明发生异常时,函数局部变量不会正常超出范围。
这是一个简化的代码示例:
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
当它如图所示运行时,它显示了我的期望:
Init outer_object
Init inner_object
Del inner_object
Del outer_object
但如果我取消注释 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 中发生异常时,函数局部变量究竟会发生什么?它们是否被保存在某个地方,因此它们不会像往常一样超出范围?控制这种行为的“正确方法”是什么?
【问题讨论】:
标签: python exception exception-handling scope