Как работают блоки try, except, else и finally в Python?

Ответ

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

Почему используются: Это позволяет изолировать потенциально проблемный код, перехватывать и обрабатывать конкретные ошибки, а также гарантировать выполнение определённого кода независимо от возникновения исключений.

Описание блоков:

  • try: Содержит код, который может вызвать исключение. Если исключение возникает, выполнение try немедленно прекращается, и управление передаётся в соответствующий блок except.
  • except: Выполняется, если в блоке try возникло исключение. Можно указать конкретный тип исключения для перехвата (например, except ZeroDivisionError:), или перехватить все исключения (except Exception as e:).
  • else: Выполняется только в том случае, если код в блоке try завершился без каких-либо исключений. Это полезно для кода, который должен выполняться только при успешном исходе try.
  • finally: Выполняется всегда, независимо от того, возникло ли исключение в try или нет, и было ли оно перехвачено. Этот блок часто используется для освобождения ресурсов (например, закрытие файлов, сетевых соединений).

Пример:

def divide_numbers(a, b):
    try:
        result = a / b  # Потенциально может вызвать ZeroDivisionError
    except ZeroDivisionError:
        print("Ошибка: Деление на ноль невозможно.")
        return None
    except TypeError:
        print("Ошибка: Некорректные типы данных для деления.")
        return None
    else:
        print(f"Деление успешно. Результат: {result}")
        return result
    finally:
        print("Блок finally всегда выполняется (очистка ресурсов, если нужно).")

print("--- Пример 1: Успешное выполнение ---")
divide_numbers(10, 2)

print("n--- Пример 2: Деление на ноль ---")
divide_numbers(10, 0)

print("n--- Пример 3: Некорректные типы ---")
divide_numbers(10, "два")

Порядок выполнения:

  1. try → нет ошибки → elsefinally
  2. try → ошибка → exceptfinally
  3. Если исключение не перехвачено ни одним except блоком, finally всё равно выполнится, а затем исключение будет распространено дальше.