v1.0.0

Python с нуля для ЕГЭ · Ожидаемые ошибки: try и except

Урок курсаPython 35 задачБесплатно

Ожидаемые ошибки: try и except

Научимся перехватывать только ожидаемую ошибку, сохранять понятный путь программы и не прятать настоящие сбои.

Теория

Некоторые ошибки являются частью обычного сценария

Раньше мы читали traceback, чтобы исправить код. Но пользователь действительно может написать слово там, где программа просит число. Код исправен; ему нужен понятный путь восстановления.

text = input("Количество: ")try:    count = int(text)except ValueError:    print("Нужно целое число")else:    print(count * 2)

В блок try помещена только рискованная операция. Вexcept ValueError находится восстановление именно после неверного преобразования, а else выполняется после успешного ввода.

У исключения должна быть известная причина

Разберём на примере
Почему не стоит ловить всё
Внутри try есть преобразование числа и обращение к неизвестной переменной.
  1. ValueError от int можно ожидать из-за пользовательского текста.
  2. NameError означает ошибку автора программы и требует исправления кода.
  3. except без типа скрыл бы обе причины под одним сообщением.
  4. Узкий except ValueError сохраняет настоящий NameError видимым.
Проверьте себя
Почему в try лучше оставить только операцию, которая ожидаемо может завершиться ошибкой?
Так except не примет случайный сбой соседнего кода за известную ситуацию.

Цикл позволяет спокойно попросить значение ещё раз

Если без числа продолжать нельзя, знакомый while повторяет запрос. Успешное преобразование завершает цикл через break.

while True:    try:        count = int(input("Количество: "))    except ValueError:        print("Введите целое число")    else:        break print(count)

Сначала решаем, можно ли восстановиться

Как действовать
Проверяем необходимость try/except
  1. Назовите риск. Какое конкретное исключение ожидается?
  2. Назовите восстановление. Что полезного программа сделает после него?
  3. Сузьте try. Оставьте только связанную рискованную операцию.
  4. Не прячьте неизвестное. Остальные ошибки должны сохранить traceback.
  5. Проверьте два пути. Запустите успешный и ошибочный ввод.
Проверьте себя
Когда исключение стоит обрабатывать, а не просто исправлять?
Когда причина ожидаема во время нормальной работы и программа знает конкретный безопасный способ продолжить.

Практика

Назовите ожидаемую ошибку

Какое исключение возникнет у int("семь")?

Подсказка
Такой текст нельзя преобразовать в целое число.
Решение

int получает строку неподходящего формата и вызывает ValueError.

Не спрячьте опечатку

Какой вариант уже: except ValueError или except без типа?

Подсказка
Узкий обработчик называет одну ожидаемую причину.
Решение

except ValueError обрабатывает только ошибку нужного типа и оставляет другие сбои видимыми.

Продолжите после успеха

Какой блок выполняется после успешного try, если исключения не было?

Подсказка
В примере он печатает удвоенное число.
Решение

Блок else выполняется только если try завершился без исключения.

Завершите повторный ввод

Какое слово завершает while True после успешного преобразования числа в примере урока?

Подсказка
Оно останавливает ближайший цикл.
Решение

После успешного ввода break завершает цикл и программа продолжает работу.

Проверьте два пути локально

Запустите пример повторного ввода. Введите три, затем 3. Сколько раз появится сообщение Введите целое число?

Подсказка
Второй ввод успешно преобразуется.
Решение

Сообщение появляется после первого ValueError; ввод 3 завершает цикл без новой ошибки.

Итог

Вы умеете сохранить понятный пользовательский сценарий после ожидаемой ошибки и при этом не спрятать настоящую проблему программы.

Этот навык пригодится при чтении файлов и в финальном менеджере задач, где ввод и сохранённые данные не всегда оказываются правильными с первого раза.

Прогресс

0 / 5
x

Вы ещё не решали задания