Да, он действует как блок finally
после блока try
, то есть он всегда выполняется (если, конечно, процесс python не завершается необычным образом).
Это также упоминается в одном из примеров PEP-343 , который является спецификацией для оператора with
:
with locked(myLock):
# Code here executes with myLock held. The lock is
# guaranteed to be released when the block is left (even
# if via return or by an uncaught exception).
Однако стоит упомянуть, что вы не можете легко перехватывать исключения, генерируемые вызовом open()
, не помещая весь блок with
в блок try..except
, что обычно не то, что нужно.