Можно ли использовать блок `finally` без блока `except`? Приведите пример.

Да, блок finally можно использовать без блока except. Он будет выполнен в любом случае, независимо от того, было ли исключение в блоке try или нет.

Пример:

try:
    f = open("my_file.txt", "r")
    # ... какие-то действия с файлом ...
finally:
    f.close() # Гарантированно закрывает файл, даже если в try возникнет исключение.
  

Да, блок finally можно использовать без блока except в Python. Блок finally предназначен для выполнения кода, который должен быть выполнен в любом случае, независимо от того, произошло исключение или нет. Он гарантированно выполнится либо после завершения блока try, либо после обработки исключения (если оно возникло) в соответствующем блоке except (если он есть).

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

Пример:


def example_finally_without_except(numerator, denominator):
    try:
        result = numerator / denominator
        print(f"Результат деления: {result}")
    finally:
        print("Блок finally всегда выполняется.")

# Пример 1: Деление без ошибок
print("Пример 1:")
example_finally_without_except(10, 2)

# Пример 2: Деление на ноль (вызывает исключение)
print("\nПример 2:")
try:
    example_finally_without_except(10, 0)
except ZeroDivisionError as e:
    print(f"Поймано исключение: {e}")
  

Разъяснение примера:

  • Пример 1: В первом примере деление выполняется успешно. Блок try завершается нормально, затем выполняется блок finally.
  • Пример 2: Во втором примере происходит деление на ноль, что вызывает исключение ZeroDivisionError. Поскольку блока except внутри функции нет, но есть в вызывающем коде, исключение перебрасывается в вызывающий код после выполнения блока finally. Обратите внимание, что блок finally все равно выполняется, даже если возникает необработанное исключение.

Когда это полезно?

finally особенно полезен для освобождения ресурсов (закрытие файлов, соединений с базой данных, и т.д.), которые были выделены в блоке try. Он гарантирует, что эти ресурсы будут освобождены, независимо от того, как завершится выполнение блока try.

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

0