Какие блоки для обработки исключений есть в Python?

Ответ

В Python для обработки исключений используется конструкция try/except со следующими блоками:

  1. try: — блок, в котором размещается код, способный вызвать исключение (ошибку).
  2. except [ТипИсключения]: — блок-обработчик. Выполняется, если в try возникло исключение указанного типа. Можно использовать несколько блоков except для разных типов ошибок.
  3. else: (опционально) — блок, который выполняется только если в блоке try не было выброшено ни одного исключения.
  4. finally: (опционально) — блок, который выполняется всегда, независимо от того, было исключение или нет. Используется для обязательных действий (закрытие файлов, соединений с БД).

Практический пример с пояснением:

def safe_divide(x, y):
    try:
        result = x / y  # Потенциально опасная операция
    except ZeroDivisionError:
        print("Ошибка: Деление на ноль!")
        result = None
    except TypeError:
        print("Ошибка: Неверный тип аргументов (ожидались числа).")
        result = None
    else:
        # Сработает только если деление прошло успешно
        print(f"Деление выполнено успешно.")
    finally:
        # Сработает в любом случае, например, для логирования
        print(f"Операция деления {x} / {y} завершена.n")
    return result

print(safe_divide(10, 2))  # Сработают try -> else -> finally
print(safe_divide(10, 0))  # Сработают try -> except ZeroDivisionError -> finally

Ответ 18+ 🔞

А, ну это ж классика, ебушки-воробушки! Смотри, как тут всё устроено, чтобы твой код не накрылся медным тазом при первой же ошибке. Всё крутится вокруг четырёх главных блоков, как будто в цирке.

Вот представь: ты пишешь код в блоке try:. Это как зайти на минное поле — вроде идёшь, но подозрение ебать чувствую, что щас что-то бахнет. Если всё ок — молодца, проскочил. Если нет — летишь прямиком в except, где тебя уже ждут с распростёртыми объятиями и готовы ошибку поймать. Можно даже несколько таких ловушек поставить на разные типы косяков.

А вот else: — это такая хитрая жопа. Он срабатывает только если в try всё было чисто, нихуя не взорвалось. Типа бонус за аккуратность.

Ну и звезда программы — finally:. Этот пацан работает всегда, без вариантов. Был ералаш или нет — ему похуй. Он как последний пацан в баре, который всегда выключает свет и запирает дверь. Идеально, чтобы файлы закрыть или соединения к базе прибить, а то потом ресурсы висят, как сопли.

Смотри на живом примере, сейчас всё станет ясно:

def safe_divide(x, y):
    try:
        result = x / y  # Вот тут самый пиздец может случиться, если y ноль
    except ZeroDivisionError:
        print("Ошибка: Деление на ноль!")
        result = None
    except TypeError:
        print("Ошибка: Неверный тип аргументов (ожидались числа).")
        result = None
    else:
        # А это выполнится, только если всё прошло как по маслу
        print(f"Деление выполнено успешно.")
    finally:
        # А этот чувак отработает в любом случае, хоть ты тресни
        print(f"Операция деления {x} / {y} завершена.n")
    return result

print(safe_divide(10, 2))  # Всё ок: try -> else -> finally
print(safe_divide(10, 0))  # А вот тут пиздец: try -> except ZeroDivisionError -> finally

Вот и вся магия. Главное — не бздеть и пользоваться, а то без этого твой код превратится в одну большую ошибку, которая всех пошлёт нахуй при первом же чихе.