Справочная информация: я занимаюсь программированием COM в TestStand от National Instruments на Python. TestStand жалуется, если объекты не были «освобождены» должным образом (он вызывает диалоговое окно отладки «объекты не были освобождены должным образом») Способ высвобождения COM-объектов TestStand в Python состоит в том, чтобы все переменные больше не содержали объект, например 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 происходят исключения, что именно происходит с локальными переменными функции? Их где-то спасают, чтобы они не выходили за рамки обычного? Что такое «правильный способ» контролировать это поведение?