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] вызывает IndexError → except перехватывает → выводит «Индекс вне диапазона». После except программа продолжается: выводит «Продолжаем».
Итог
try:+except ExceptionType:— перехватить конкретное исключение.except ExceptionType as e:— получить объект исключения с описанием.- Указывайте конкретный тип исключения, не
except Exception:. - Несколько
except— для разных типов; кортеж вexcept— для одинаковой обработки. - После обработки исключения программа продолжается с кода после
try/except.
В следующем уроке рассмотрим расширенный синтаксис: несколько блоков except, блок else (код при успехе) и finally (код в любом случае).