Коротко: 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 перевіряє їх зверху вниз і зупиняється на першому, що підходить. Якщо поставити загальніший тип помилки раніше за конкретніший, конкретний блок нижче просто ніколи не спрацює — ще один привід, чому розуміння того, який саме виняток виникає в коді, важливіше за механічне копіювання конструкції з прикладу.