Модуль 7A: Налагодження та обробка помилок (глибше)

Типові помилки новачків (TypeError, NameError, IndexError, KeyError)

📖 Теорія
Розглянемо найчастіші помилки, які зустрічають новачки в Python.

TypeError — операція з непідходящим типом даних:
• '5' + 3 — не можна додавати рядок і число
• len(42) — len() не працює з числами

NameError — змінна не визначена:
• print(hello) — забули лапки або не створили змінну
• Друкарська помилка в імені змінної

IndexError — звернення до неіснуючого індексу:
• lst = [1, 2, 3]; lst[5] — індекс 5 не існує
• Часто при переборі списку вручну

KeyError — звернення до неіснуючого ключа словника:
• d = {'a': 1}; d['b'] — ключа 'b' немає
• Рішення: використовуйте d.get('b', значення_за_замовчуванням)

SyntaxError — порушення синтаксису Python:
• Забуте двокрапка після if/for/def
• Незакрита дужка або лапка

ValueError — правильний тип, але непідходяще значення:
• int('abc') — рядок 'abc' не можна перетворити в число
💡 Приклад коду
Вивід:

                        
📝 ЗАВДАННЯ (3)
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 208
" data-task-id="
Warning: Undefined array key "id" in /home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 209
" data-xp="10">
1.
Завдання: Виправ усі помилки
10 XP
У коді нижче 5 помилок різних типів. Знайдіть та виправте кожну:

age = input('Вік: ')
print('Через рік вам буде: ' + age + 1)

colors = ['червоний', 'синій', 'зелений']
print(colors[3])

user = {'name': 'Аня'}
print('Email: ' + user['email'])

print(mesage)
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 278
">
💡 Підказка: 1) age — рядок, потрібно int(). 2) Конкатенація рядка і числа. 3) Індекс 3 не існує. 4) Ключ 'email' відсутній. 5) Друкарська помилка в імені змінної.
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 287
">
🔓 Розв'язок:
age = int(input('Вік: '))
print('Через рік вам буде: ' + str(age + 1))

colors = ['червоний', 'синій', 'зелений']
print(colors[2])

user = {'name': 'Аня'}
print('Email: ' + user.get('email', 'не вказано'))

message = 'Привіт'
print(message)
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 296
">
Вивід:

                                
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 304
">

/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 208
" data-task-id="
Warning: Undefined array key "id" in /home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 209
" data-xp="20">
2.
Завдання: Визнач тип помилки
20 XP
Для кожного фрагмента коду визначте, який тип помилки виникне (не запускаючи код):
1) len(100)
2) items = []; items[0]
3) data = {}; data['key']
4) x = int('hello')
5) if True print('так')
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 278
">
💡 Підказка: Подумайте: що не так з типом, індексом, ключем, значенням або синтаксисом?
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 287
">
🔓 Розв'язок:
# 1) TypeError — len() не працює з числами
# 2) IndexError — порожній список, індекс 0 не існує
# 3) KeyError — ключ 'key' відсутній у порожньому словнику
# 4) ValueError — рядок 'hello' не можна перетворити в int
# 5) SyntaxError — забуто двокрапку після if True

# Перевіримо:
try:
    len(100)
except TypeError as e:
    print(f'1) TypeError: {e}')

try:
    items = []; items[0]
except IndexError as e:
    print(f'2) IndexError: {e}')

try:
    data = {}; data['key']
except KeyError as e:
    print(f'3) KeyError: {e}')

try:
    x = int('hello')
except ValueError as e:
    print(f'4) ValueError: {e}')
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 296
">
Вивід:

                                
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 304
">

/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 208
" data-task-id="
Warning: Undefined array key "id" in /home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 209
" data-xp="30">
3.
Завдання: Захисний код
30 XP
Напишіть функцію safe_get(lst, index), яка повертає елемент списку за індексом. Якщо індекс виходить за межі — повертає None та друкує попередження.
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 278
">
💡 Підказка: Використовуйте try/except IndexError або перевірку if 0 <= index < len(lst)
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 287
">
🔓 Розв'язок:
def safe_get(lst, index):
    try:
        return lst[index]
    except IndexError:
        print(f'Попередження: індекс {index} за межами списку (довжина: {len(lst)})')
        return None

numbers = [10, 20, 30]
print(safe_get(numbers, 1))   # 20
print(safe_get(numbers, 5))   # None + попередження
print(safe_get(numbers, -1))  # 30
print(safe_get([], 0))        # None + попередження
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 296
">
Вивід:

                                
/home/u994965865/domains/navychky.com.ua/public_html/course/lesson.php on line 304
">