Конструкция try
содержит еще одно необязательное предложение, которое предназначено для определения действий очистки, которые должны выполняться при любых обстоятельствах. Например:
try: raise KeyboardInterrupt finally: print('Goodbye, world!') # Goodbye, world! # KeyboardInterrupt # Traceback (most recent call last): # File "<stdin>", line 2, in <module>
Если инструкция finally
присутствует, то она будет выполняться как последняя задача перед завершением выполнения конструкции try
. Инструкция finally
выполняется независимо от того, создает ли блок кода в операторе try
исключение. В следующих пунктах рассматриваются более сложные случаи, когда возникает исключение:
try
, исключение может быть обработано инструкцией except
. Если исключение не обрабатывается предложением except
, исключение повторно вызывается после выполнения инструкции finally
.except
или else
конструкции try
. Опять же, исключение повторно вызывается после выполнения инструкции finally
.try
имеется оператор break
, continue
или return
, инструкция finally
будет выполняться непосредственно перед выполнением оператора break
, continue
или return
.return
имеется в инструкции try
и finally
, то оператор return
в инструкции finally
выполнится последним, т. е. вместо return
, который в инструкции try
.Например:
def bool_return(): try: return True finally: return False >>> bool_return() # False
Более сложный пример:
def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: print("result is", result) finally: print("executing finally clause") >>> divide(2, 1) # result is 2.0 # executing finally clause >>> divide(2, 0) # division by zero! # executing finally clause >>> divide("2", "1") # executing finally clause # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "<stdin>", line 3, in divide # TypeError: unsupported operand type(s) for /: 'str' and 'str'
Как видно из примеров, инструкция finally
выполняется в любом случае. TypeError
, вызванный разделением двух строк, не обрабатывается предложением except
и поэтому повторно вызывается после выполнения предложения finally
.
В реальных приложениях инструкция finally
полезна для освобождения внешних ресурсов, таких как файлы или сетевые подключения, подключения к базам данным, независимо от того, было ли использование ресурса успешным.