Обработка ошибок ввода и отсутствия файла
Содержание курса
Правильное размещение break и пошаговая реализация цикла
Самая частая ошибка при написании цикла повторного запроса — break стоит не там, где нужно. Выглядит это так:
# Неправильно
while True:
try:
n = int(input('Введите число: '))
except ValueError:
print('Это не число. Попробуйте ещё раз.')
break # <-- здесь
break здесь стоит после блока try-except, то есть на одном уровне отступа с try. Что происходит при выполнении? Независимо от того, было исключение или нет, после обработки try-except Python доходит до break и выходит из цикла. Пользователь получает ровно один шанс — и если он ввёл 'abc', программа всё равно завершает цикл, переменная n не определена, и дальнейший код упадёт с NameError.
Правильный вариант — break внутри try, после успешного преобразования:
# Правильно
while True:
try:
n = int(input('Введите число: '))
break # выполняется только если int() не бросил исключение
except ValueError:
print('Это не число. Попробуйте ещё раз.')
print('Принято:', n)
Когда int(input(...)) бросает ValueError, выполнение немедленно уходит в except — строка с break просто не достигается. Цикл продолжается. Когда преобразование проходит успешно, break достигается и цикл завершается. Именно так позиция одной строки определяет, работает паттерн или нет.
Чтобы каждый раз не думать «куда поставить break», удобно держать в голове чёткую последовательность шагов.
Шаг 1.
Написать while True: — это каркас, который держит цикл активным.
Шаг 2.
Внутри сразу написать try: — весь опасный код пойдёт сюда.
Шаг 3.
В блоке try разместить вызов int(input(...)) или другое преобразование, которое может бросить исключение.
Шаг 4.
Следующей строкой после преобразования — break. Физически: сразу под строкой с int(input(...)), на том же уровне отступа внутри try.
Шаг 5.
Написать except ValueError: и внутри — сообщение пользователю. break здесь не ставить.
В итоге структура всегда выглядит так:
while True:
try:
# шаг 3: опасная операция
n = int(input('Введите целое число: '))
# шаг 4: break сразу после успеха
break
except ValueError:
# шаг 5: только сообщение, без break
print('Введите целое число, не текст.')
Если нужна дополнительная проверка значения, она добавляется между преобразованием и break — как показано в предыдущей секции. Структура при этом не меняется: break по-прежнему остаётся последней точкой в try, которой программа достигает только при полном успехе.
Запомнить порядок просто: try → операция → break → except → сообщение. Всё остальное — вариации внутри этого каркаса.
