Если вы используете выделенную память, то вы не делаете ничего плохого. Это становится проблемой при написании функций (кроме основного), которые выделяют память без ее освобождения и не делают ее доступной для остальной части вашей программы. Затем ваша программа продолжает работать с выделенной ей памятью, но не использует ее. Ваша программа и другие запущенные программы лишены этой памяти.
Редактирование: на 100% невозможно сказать, что другие запущенные программы лишены этой памяти. Операционная система всегда позволяет им использовать ее за счет замены вашей программы на виртуальную память (</handwaving>
). Дело в том, что если ваша программа освобождает память, которую она не использует, смену виртуальной памяти с меньшей вероятностью необходимо.
На python2.6
Я предполагаю, что вы ожидаете, что блок finally будет связан с блоком «try», где вы вызываете исключение «B». Блок finally присоединяется к первому блоку try.
Если вы добавили блок исключений во внутренний блок try, то блок finally вызовет исключение B.
try:
raise Exception("a")
except:
try:
raise Exception("b")
except:
pass
finally:
raise
Вывод:
Traceback (most recent call last):
File "test.py", line 5, in <module>
raise Exception("b")
Exception: b
Еще один вариант, объясняющий, что здесь происходит
try:
raise Exception("a")
except:
try:
raise Exception("b")
except:
raise
Вывод:
Traceback (most recent call last):
File "test.py", line 7, in <module>
raise Exception("b")
Exception: b
Если вы видите здесь, заменив Блок finally с исключением вызывает исключение B.
Рейз повторно поднимает последнее исключение, которое вы поймали, а не последнее исключение, которое вы подняли
(оставлено для комментариев для ясности)