Python: обработка исключений
Если «Python: обработка исключений» вызывает ступор — это нормально: тема собрана из простых идей. Покажем их по порядку: теория, пример, разбор задания и типичные ошибки.
Что такое исключения в Python
Программа может выглядеть правильной, но остановиться из-за ошибки во время выполнения: пользователь ввёл текст вместо числа, файл не найден, а деление оказалось делением на ноль. Если не обработать такую ситуацию, школьник видит длинное сообщение об ошибке и не всегда понимает, где искать причину. Исключения помогают не «ломать» программу, а заранее описать её реакцию на проблему. В этой статье ты разберёшь конструкцию try и except, научишься различать типы ошибок и аккуратно завершать программу. После разбора можно проверить себя в бесплатной практике в личном кабинете.
Исключение — это событие, которое сообщает Python: обычное выполнение кода продолжать нельзя. Например, выражение 10 / 0 вызывает ZeroDivisionError. Ошибка синтаксиса устроена иначе: если забыта двоеточие или скобка, программа не запустится, и конструкция try такую проблему не исправляет.
Главная идея проста: опасный участок помещают в try, а возможную реакцию описывают в except. Код становится устойчивее, а сообщения для пользователя — понятнее.
Конструкция try и except
Минимальная схема состоит из двух блоков. В try записывают код, который может вызвать исключение. В except указывают, что сделать, если проблема действительно возникла. Отступы обязательны: они показывают Python, какие команды относятся к каждому блоку.
try:
число = int(input("Введи число: "))
print(100 / число)
except ZeroDivisionError:
print("На ноль делить нельзя")
Если пользователь введёт 0, сработает обработчик ZeroDivisionError, а программа не завершится аварийно. Если будет введено слово, возникнет уже ValueError. Один обработчик не должен маскировать все возможные причины. Лучше перечислить ожидаемые типы явно:
except (ValueError, ZeroDivisionError):
print("Проверь ввод: нужно ненулевое число")
Сначала назови конкретную ошибку, которую ожидаешь. Такой код легче читать и проверять, чем бездумное except:.
Порядок выполнения и дополнительные блоки
После успешного выполнения try блок except пропускается. Если возникло исключение, Python ищет подходящий обработчик сверху вниз. Поэтому более узкие типы ошибок ставят раньше общих. Например, FileNotFoundError является частным случаем проблем при работе с файлами, а Exception может перехватить почти любую обычную ошибку.
Блок else выполняется только тогда, когда исключения не было. Он удобен для действий, зависящих от успешного результата. Блок finally запускается в любом случае: и после успеха, и после ошибки. Его используют для обязательного завершения работы, например закрытия файла.
try:
значение = int(input("Введи целое число: "))
except ValueError:
print("Это не целое число")
else:
print("Получено:", значение)
finally:
print("Проверка завершена")
Обычно достаточно try и одного или нескольких except. Не помещай в try всю программу: иначе будет трудно понять, какая именно команда вызвала проблему.
Разобранный пример: безопасный ввод
Представим задачу: программа запрашивает количество билетов и цену одного билета, затем вычисляет общую стоимость. Нужно защитить ввод от текста, отрицательных значений и деления на ноль здесь не требуется. Используем функцию, чтобы повторять запрос, пока данные не станут корректными.
def получить_положительное_число(сообщение):
while True:
try:
число = int(input(сообщение))
if число <= 0:
raise ValueError
return число
except ValueError:
print("Введи положительное целое число")
количество = получить_положительное_число("Количество: ")
цена = получить_положительное_число("Цена: ")
print("Стоимость:", количество * цена)
Разберём ход выполнения. Функция запускает бесконечный цикл. Команда int преобразует строку в целое число; если введено слово, Python создаёт ValueError. Если число нулевое или отрицательное, мы сами вызываем это же исключение командой raise. Обработчик печатает подсказку, после чего цикл начинается снова. При корректном вводе выполняется return, функция возвращает число, и программа переходит к расчёту стоимости.
Типичные ошибки и проверка результата
Первая ошибка — перехватывать исключение слишком широко: except Exception скрывает неожиданные дефекты. В учебной задаче лучше указывать ValueError, TypeError, IndexError или другой конкретный тип. Вторая ошибка — оставлять обработчик пустым. Пользователь должен получить понятное сообщение или другой предусмотренный сценарий.
Не путай ValueError и TypeError: первое означает неподходящее значение, второе — неподходящий тип объекта для операции.
| Ситуация | Исключение | Что проверить |
|---|---|---|
int("кот") | ValueError | Можно ли преобразовать строку |
8 / 0 | ZeroDivisionError | Не равен ли делитель нулю |
список[10] | IndexError | Существует ли такой индекс |
"3" + 2 | TypeError | Совместимы ли типы данных |
Третья ошибка — забывать про отступы и двоеточие после try и except. Наконец, тестируй не только правильный ввод, но и пустую строку, слово, ноль, отрицательное число и очень большое значение.
Если готовишься к школьной проверочной или экзамену, полезно тренироваться на коротких фрагментах и объяснять, какой блок выполнится первым. Подобные задания можно разобрать в разделе подготовки к ОГЭ или в материалах для подготовки к ЕГЭ.
Что запомнить
Исключение — сигнал о проблеме во время выполнения программы. Конструкция try содержит рискованный код, except обрабатывает конкретную ошибку, else выполняется при успехе, а finally — всегда. Обрабатывай только ожидаемые ситуации и не скрывай ошибки пустыми обработчиками. Для пользовательского ввода чаще всего нужны ValueError, для деления — ZeroDivisionError, для индексов — IndexError.
Следующий шаг — зарегистрируйся и реши 5 заданий бесплатно в личном кабинете: проверь порядок выполнения блоков, типы исключений и работу finally. После каждого ответа объясни себе не только результат, но и причину выбора обработчика.
Зачем нужен блок try?
Он выделяет участок кода, где может возникнуть ожидаемая ошибка, чтобы Python мог передать управление подходящему обработчику except.
Можно ли написать несколько блоков except?
Да. Это удобно, когда для разных типов ошибок нужны разные сообщения или действия. Более конкретные исключения ставят выше общих.
Всегда ли нужен finally?
Нет. Он нужен для обязательных действий, которые должны выполниться независимо от результата, например для закрытия ресурса.
Как закрепить тему после разбора?
Реши несколько небольших задач: безопасный ввод числа, обработку деления на ноль и проверку индекса списка. Для каждой задачи заранее запиши возможный тип исключения, а затем проверь программу на разных данных.
Не оставляйте тему «прочитанной»
Понимание — половина дела. Вторая — практика с обратной связью: личный кабинет Просто Урок покажет, где вы ошибаетесь, и подтянет слабые места.