try / except: обработка ошибок

try / except: обработка ошибок

Мы знаем, какие исключения бывают и как их читать. Теперь научимся их перехватывать. Конструкция try/except позволяет «обернуть» опасный код и определить, что делать, если что-то пойдёт не так.

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

try:
    # код, который может вызвать исключение
    result = 10 / 0
except ZeroDivisionError:
    # что делать, если возникло это исключение
    print("Деление на ноль!")
    result = None

print(result)   # None

Python выполняет блок try. Если исключения не возникло — except пропускается. Если возникло ZeroDivisionError — управление переходит в except. После except программа продолжается как обычно.

Зачем конкретизировать исключение

Можно написать except Exception: — перехватить всё. Но это плохая практика: вы замаскируете неожиданные ошибки и будете думать, что код работает правильно:

# Плохо — перехватывает ВСЕГ, включая баги:
try:
    result = process_data(data)
except Exception:
    print("Что-то пошло не так")

# Хорошо — только то, что ожидаем:
try:
    result = process_data(data)
except ValueError:
    print("Неверный формат данных")

Получить объект исключения: as

Ключевое слово as позволяет получить объект исключения и прочитать его описание:

try:
    age = int("двадцать пять")
except ValueError as e:
    print(f"Ошибка: {e}")
    # Ошибка: invalid literal for int() with base 10: 'двадцать пять'

e — объект исключения; при выводе через str() или f-строку даёт читаемое описание.

Практический пример: безопасный ввод числа

Без обработки ошибок программа падает при любом нечисловом вводе. С try/except — запрашивает повторно:

def get_integer(prompt):
    while True:
        text = input(prompt)
        try:
            return int(text)
        except ValueError:
            print("Введите целое число, попробуйте снова.")

age = get_integer("Введите ваш возраст: ")
print(f"Вам {age} лет.")

Несколько except в одном блоке

На один try можно указать несколько except для разных типов исключений:

def safe_divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Делитель не может быть нулём")
        return None
    except TypeError:
        print("Аргументы должны быть числами")
        return None
    return result

print(safe_divide(10, 2))    # 5.0
print(safe_divide(10, 0))    # Делитель не может быть нулём → None
print(safe_divide(10, "2"))  # Аргументы должны быть числами → None

Перехват нескольких в одном except

Если реакция на несколько типов одинакова — можно объединить их в кортеж:

try:
    value = data[key]
    result = int(value)
except (KeyError, ValueError) as e:
    print(f"Проблема с данными: {e}")
    result = 0

Когда НЕ использовать try/except

Не оборачивайте весь код в один большой try/except. Защищайте только те строки, где ошибка реально ожидаема — конвертация пользовательского ввода, работа с файлами, сетевые запросы. Лишний try/except скрывает баги.

Проверь себя

Что выведет следующий код?

try:
    lst = [1, 2, 3]
    print(lst[10])
except IndexError:
    print("Индекс вне диапазона")
print("Продолжаем")

lst[10] вызывает IndexErrorexcept перехватывает → выводит «Индекс вне диапазона». После except программа продолжается: выводит «Продолжаем».

Итог

  • try: + except ExceptionType: — перехватить конкретное исключение.
  • except ExceptionType as e: — получить объект исключения с описанием.
  • Указывайте конкретный тип исключения, не except Exception:.
  • Несколько except — для разных типов; кортеж в except — для одинаковой обработки.
  • После обработки исключения программа продолжается с кода после try/except.

В следующем уроке рассмотрим расширенный синтаксис: несколько блоков except, блок else (код при успехе) и finally (код в любом случае).

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике