Ошибки и отладка

Обработка ошибок ввода и отсутствия файла

Содержание курса

Правильное размещение 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 → операция → breakexcept → сообщение. Всё остальное — вариации внутри этого каркаса.