Python Glossary English

все 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Сообщить о неточности