Блок try/except: перехват исключений

Блок try/except в Python: как перехватывать ошибки, получать информацию об исключении и не давать программе упасть.

Исключение (exception) — это сигнал об ошибке, который Python генерирует, когда не может выполнить операцию. Блок try/except позволяет перехватить этот сигнал и обработать его.

Базовый синтаксис

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Делить на ноль нельзя!")

print("Программа продолжается")

Вывод:

Делить на ноль нельзя!
Программа продолжается

Без try/except программа бы упала с сообщением ZeroDivisionError: division by zero. С блоком — ошибка перехвачена, выполнение продолжается.

Получение информации об ошибке

Конструкция except ТипОшибки as e позволяет получить объект исключения и вывести его описание:

numbers = [1, 2, 3]

try:
    print(numbers[10])
except IndexError as e:
    print(f"Ошибка: {e}")
    print(f"Тип: {type(e).__name__}")

Вывод:

Ошибка: list index out of range
Тип: IndexError

Несколько типичных исключений

Исключение

Причина

ZeroDivisionError

деление на ноль

ValueError

неправильное значение аргумента

TypeError

неправильный тип данных

IndexError

индекс вне диапазона

KeyError

ключ не найден в словаре

FileNotFoundError

файл не существует

Защита преобразования типов

def safe_int(s):
    try:
        return int(s)
    except ValueError:
        return None

print(safe_int("42"))     # 42
print(safe_int("abc"))    # None
print(safe_int("3.14"))   # None — int() не принимает дробную строку

Вывод:

42
None
None

Паттерн «обернуть рискованный вызов в функцию с try/except и вернуть None при ошибке» — один из самых распространённых в Python-коде.

Bare except — почему не стоит

# Плохо: ловим ВСЕ ошибки, включая KeyboardInterrupt и SystemExit
try:
    risky()
except:        # без указания типа
    pass

# Хорошо: ловим только ожидаемые
try:
    risky()
except (ValueError, TypeError) as e:
    print("Ожидаемая ошибка:", e)

Голый except перехватывает даже нажатие Ctrl+C и скрывает неожиданные баги — это затрудняет отладку. Всегда указывайте конкретный тип.

Коротко

  • try — код, который может выбросить исключение; except ТипОшибки — обработчик.
  • except ТипОшибки as e даёт доступ к объекту исключения и его описанию.
  • Всегда указывайте конкретный тип исключения — не используйте голый except.
  • После перехвата исключения программа продолжает выполнение.
Проверьте себя
1. Что произойдёт с программой, если исключение перехвачено в except?
AПрограмма завершится с ошибкой
BПрограмма продолжит выполнение после блока try/except
CПрограмма перезапустится
DВыполнится только блок finally
2. Как получить текстовое описание перехваченного исключения?
Aexcept Error.message
Bexcept ValueError as e: print(e)
Cexcept get_message(ValueError)
Derror.description()
3. Почему не рекомендуется использовать голый except без указания типа?
AЭто синтаксическая ошибка
BОн работает медленнее
CОн перехватывает даже KeyboardInterrupt и SystemExit, скрывая неожиданные баги
DОн работает только в Python 2
Поддержать проект