все Python 3Исключенияконструкция
finally
обработка
Блок finally выполняется всегда — независимо от того, было ли исключение. Используется для освобождения ресурсов.
Синтаксис
try:
...
finally:
cleanup()
Главная ловушка — return, break или continue внутри самого finally: они гасят летящее исключение и подменяют результат try, из-за чего ошибка исчезает бесследно; в Python 3.14 такой код уже даёт SyntaxWarning. finally срабатывает и при выходе через return: значение сначала вычисляется, потом идёт finally, и только затем функция действительно возвращает. Для файлов, сокетов и блокировок обычно лучше with — менеджер контекста делает то же самое короче и без шанса забыть закрытие.
Примеры
def read_file(path):
f = None
try:
f = open(path)
return f.read()
except FileNotFoundError:
return None
finally:
if f:
f.close()
print('File handle closed') # печатается всегда — и при успехе, и при ошибке
def divide(a, b):
try:
return a / b
finally:
print('division attempted') # → division attempted
print(divide(10, 2)) # → 5.0
# finally при return
def func():
try:
return 'try'
finally:
return 'finally' # перекрывает return из try!
print(func()) # → finally
# finally при raise
def func2():
try:
raise ValueError('oops')
finally:
print('cleanup') # → cleanup (до распространения исключения)
try:
func2()
except ValueError:
pass
# Классический паттерн с ресурсом
import sqlite3
conn = None
try:
conn = sqlite3.connect(':memory:')
except Exception as e:
print(e)
finally:
if conn:
conn.close()
print('Connection closed') # → Connection closed
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности