Коротко: try/except — конструкция, которая позволяет коду «поймать» ошибку и отреагировать на неё вместо того, чтобы программа просто останавливалась с красным текстом. На курсе Python: Игры и боты (10-14 лет) это тема 4 из 12 — «Файлы и обработка ошибок», и к ней дети уже умеют писать функции и работать со списками, поэтому обработка ошибок становится естественным следующим шагом, а не отдельным сложным разделом.
До этой темы ошибка в коде ребёнка выглядит как провал: программа «сломалась», преподаватель что-то подкрутил, всё заработало. После темы «Файлы и обработка ошибок» та же самая ошибка становится ожидаемым событием, которое код сам предусматривает. Это именно та разница, которую курс пытается показать — не «писать код без ошибок» (что невозможно даже для опытных разработчиков), а «писать код, который не падает от чужой ошибки».
Что такое исключение (exception) простыми словами
Когда Python выполняет строку кода и что-то идёт не так — деление на ноль, обращение к файлу, которого нет, ввод буквы там, где ожидалось число — он создаёт объект-исключение (exception) и останавливает выполнение, если это исключение никто не перехватил. Увидеть это легко в обычном скрипте:
age = int(input("Сколько тебе лет? "))
print("Через год тебе будет", age + 1)
Если ввести число — всё работает. Если ввести слово «десять» вместо цифры 10 — Python выдаст ValueError: invalid literal for int() и программа остановится. На занятии дети сначала видят именно эту ошибку живой, а уже потом узнают, как её перехватить.
Как выглядит try/except на практике
Базовая конструкция оборачивает рискованный код в блок try, а реакцию на ошибку — в блок except:
try:
age = int(input("Сколько тебе лет? "))
print("Через год тебе будет", age + 1)
except ValueError:
print("Это не похоже на число. Попробуй ещё раз цифрами.")
Теперь тот же самый ошибочный ответ не останавливает программу, а выводит понятное сообщение. Это первый и самый важный урок темы: обработка ошибок — не про то, чтобы защитить код от всех возможных проблем вообще, а про то, чтобы программа реагировала предсказуемо на конкретную, ожидаемую проблему.
Почему «except:» без типа ошибки — плохая идея, даже для начинающего
Самая частая ошибка новичков на этой теме — писать except: без указания типа, чтобы «перехватить вообще всё». Это работает, но скрывает настоящую причину сбоя: если код упадёт из-за опечатки в имени переменной, тот же самый голый except тихо проглотит и её, и ребёнок долго будет искать, почему «ничего не происходит», вместо того чтобы увидеть понятную ошибку сразу.
На курсе это объясняют через аналогию со скорой помощью: врач, который «лечит всё одними и теми же лекарствами независимо от диагноза», вредит чаще, чем помогает. except ValueError, except ZeroDivisionError, except FileNotFoundError — каждый перехватывает свою, конкретную ситуацию, и код остаётся читаемым: видно сразу, какую именно проблему предусмотрел автор.
Зачем эта тема именно после работы с файлами
Тема 4 курса Python: Игры и боты объединяет файлы и обработку ошибок не случайно. Работа с файлами — самый частый источник реальных, а не учебных ошибок: файл может не существовать, лежать в другой папке, быть открытым в другой программе. Код, который читает файл без try/except, падает от малейшей мелочи:
try:
with open("rezultaty.txt") as f:
data = f.read()
except FileNotFoundError:
print("Файл не найден. Проверь название и папку.")
Это первый пример на курсе, где обработка ошибок решает реальную, а не придуманную проблему — файл действительно может потеряться, название действительно может быть написано с опечаткой. Дети видят разницу между «теоретическим» try/except на выдуманном примере и тем же самым кодом, который за несколько минут действительно спасает их собственный проект от сбоя.
Обязательно ли писать try/except в каждой программе
Нет, и на курсе это проговаривают прямо: оборачивать в try/except вообще весь код — признак не опыта, а неуверенности. Обработку ошибок добавляют там, где код касается чего-то, что ребёнок не контролирует полностью: ввод пользователя, файл, сеть, внешние данные. Арифметику с известными числами или простой вывод текста в try/except не прячут — там просто нечего перехватывать.
Как это связано с типичными ошибками новичков
Большинство сбоев, которые случаются на предыдущих занятиях курса, — это синтаксические ошибки (пропущенное двоеточие, неправильный отступ), которые Python ловит ещё до запуска, и try/except здесь вообще не помогает: он работает только с ошибками во время выполнения, а не с ошибками в самом написании кода. Подробнее о том, какие ошибки типичны для первых месяцев курса и как их читать, — в статье «Типичные ошибки новичков в Python и как их исправить».
Разница важна: синтаксическая ошибка — это «код написан неправильно», и единственный способ её устранить — исправить сам код. Исключение (exception) — это «код написан правильно, но ситуация во время выполнения пошла не так», и именно для этого второго типа существует try/except.
Где обработка ошибок встречается дальше на курсе
После темы 4 этот приём не исчезает — он возвращается в теме 9 («Telegram-бот: основы»), где бот не должен падать от неожиданного сообщения пользователя, и в теме 5 («Работа с API»), где внешний сервис может ответить с ошибкой или вообще не ответить. Функции, которые дети уже умеют писать на этом этапе курса, часто сами становятся тем кодом, который оборачивают в try/except: подробнее о том, как устроены функции на курсе, — в статье «Функции в Python: справочник с примерами для детей».
На занятии преподаватели часто просят детей намеренно «сломать» собственную программу — ввести не то, что ожидается, — а потом добавить try/except, который эту ситуацию уже не считает сбоем. Это быстрее убеждает в пользе темы, чем любое теоретическое объяснение заранее.
Встречается ли try/except в других языках, которые учит ребёнок на курсах сети
Да, и почти в том же виде: похожая конструкция try/catch есть в JavaScript и Lua. Ребёнок, освоивший логику обработки ошибок на Python, не учит её «с нуля» второй раз — переносится сама идея «перехватить и предусмотреть», меняется только синтаксис ключевых слов.
Что делает блок finally и когда он действительно нужен
Рядом с try и except в Python существует третий, необязательный блок — finally. Код в нём выполняется всегда, независимо от того, случилась ошибка или нет:
try:
f = open("rezultaty.txt")
data = f.read()
except FileNotFoundError:
print("Файл не найден.")
finally:
print("Попытка чтения завершена.")
На курсе finally объясняют через аналогию с выключением света: независимо от того, удалось ли найти нужную вещь в комнате, свет выключают, выходя из неё. Чаще всего finally применяют, чтобы гарантированно закрыть файл или соединение, даже если во время работы с ним произошёл сбой — это уже за пределами обязательной программы темы 4, но естественный следующий шаг для ребёнка, который хочет понять конструкцию до конца.
Обработка ошибок — одна из тех тем курса, которые на первый взгляд выглядят как техническая деталь, а на практике меняют то, как ребёнок вообще относится к собственным ошибкам в коде: не как к провалу, а как к ожидаемой ситуации, которую можно предусмотреть заранее.
Можно ли перехватить несколько разных ошибок в одном блоке
Да, и на курсе это показывают сразу после базового примера: один try может иметь несколько блоков except подряд, каждый для своего типа ошибки, и Python проверяет их по очереди, пока не найдёт подходящий:
try:
num = int(input("Введи число: "))
result = 10 / num
except ValueError:
print("Это не число.")
except ZeroDivisionError:
print("На ноль делить нельзя.")
Этот пример дети пишут сразу после базового try/except, потому что он показывает главную причину называть тип ошибки явно: без неё было бы невозможно дать пользователю два разных, конкретных сообщения для двух разных причин сбоя.
Порядок блоков except здесь имеет значение: Python проверяет их сверху вниз и останавливается на первом подходящем. Если поставить более общий тип ошибки раньше более конкретного, конкретный блок ниже просто никогда не сработает — ещё одна причина, почему понимание того, какое именно исключение возникает в коде, важнее механического копирования конструкции из примера.