Какой блок всегда выполняется в конструкции `try`, `except`, `finally`?

Блок finally всегда выполняется, независимо от того, было ли исключение в блоке try или нет.

В конструкции try, except, finally блок finally всегда выполняется, независимо от того, было ли исключение или нет, и было ли оно обработано в блоке except или нет.

Рассмотрим несколько сценариев для пояснения:

  • Если в блоке try не произошло исключение: try блок выполняется полностью, затем выполняется блок finally.
  • Если в блоке try произошло исключение, и есть соответствующий блок except, способный его обработать: try блок выполняется до момента исключения, затем выполняется соответствующий блок except, и после него выполняется блок finally.
  • Если в блоке try произошло исключение, но нет соответствующего блока except, способного его обработать: try блок выполняется до момента исключения. Блок finally выполняется, а затем исключение "всплывает" выше по стеку вызовов (если его никто не обработает, то программа завершится с ошибкой). Важно отметить, что в этом случае finally все равно выполнится до того, как исключение распространится дальше.
  • Если в блоке except происходит исключение: Выполнится блок except до исключения, далее блок finally, а затем необработанное исключение всплывет.
  • Если в блоке finally происходит исключение: Выполняется finally до исключения, и затем это исключение "всплывает", заменяя собой любое исключение, которое могло произойти в try или except. Это важно помнить, чтобы не потерять важную информацию об исходной ошибке.
  • Если в блоке try, except или finally происходит оператор return, break или continue: Блок finally все равно будет выполнен перед выходом из функции, цикла или любого другого блока кода. Значение return определится до выполнения блока finally.

Блок finally обычно используется для выполнения действий, которые должны быть выполнены в любом случае, например, для закрытия файлов, освобождения ресурсов, закрытия сетевых соединений и т.д.

Пример:


try:
    file = open("my_file.txt", "r")
    # ... работа с файлом ...
except FileNotFoundError:
    print("Файл не найден")
finally:
    if 'file' in locals() and file:
        file.close()  # Гарантированное закрытие файла
    print("Блок finally выполнен")
0