У меня есть следующий код:
class A:
def __del__(self):
print('del A')
class B:
def foo(self):
a = A()
raise RuntimeError
b = B()
try:
b.foo()
print('after b.foo() 1')
except RuntimeError:
print('catch error')
print('after b.foo() 2')
Вывод:
catch error
del A
after b.foo() 2
Мои вопросы:
1) Кажется, что a
удаляется после обработки исключений. Может ли кто-нибудь помочь объяснить порядок выпуска переменной в таких случаях?
2) Как вручную освободить переменную a
в начале блока except RuntimeError
?
Еще несколько слов о случае использования:
Я хотел бы перехватить CUDA из-за ошибки памяти, возникшей в B.foo()
, и освободить некоторые a
(некоторые переменные, занимающие слишком много памяти CUDA) в начале блока except RuntimeError
, Затем я могу разделить данные на более мелкие части и сделать это снова.