Статья Автор: Деникина Наталья Владимировна

Частые ошибки при разработке программ

Python · ПамяткаТипичные ошибки в проекте
SilverTests.rudebugging · testing · project
Типичные ошибки в проекте

Что ломается в коде, в файлах и в интерфейсе — и как починить


1Ошибки при работе с API
KeyError — неправильный путь в JSON
data = {"current": {"temperature_2m": 12.5}}

print(data["temperature_2m"])              # KeyError!
print(data["current"]["temperature_2m"])  # 12.5 — правильно

Ключ temperature_2m лежит не в корне, а внутри current. Пропущен промежуточный ключ.

IndexError — пустой список от API
data = []   # API не нашёл праздников

print(data[0]["localName"])  # IndexError!

# Правильно:
if data:
    print(data[0]["localName"])
else:
    print("Нет данных")
JSONDecodeError — .json() без проверки status_code
# Сервер вернул HTML-страницу с ошибкой, а не JSON
response = requests.get(url)
data = response.json()   # JSONDecodeError!

# Правильно:
if response.status_code == 200:
    data = response.json()
else:
    print("Ошибка:", response.status_code)
403 Forbidden — нет заголовка User-Agent
# Wikipedia без User-Agent — 403
response = requests.get("https://ru.wikipedia.org/api/rest_v1/page/random/summary")
print(response.status_code)   # 403

# Правильно:
headers = {"User-Agent": "MyApp/1.0 (student@school.ru)"}
response = requests.get(url, headers=headers, timeout=10)
ConnectionError — нет интернета
# Без интернета requests.get() бросает исключение
# Объект response не создаётся — проверять status_code не у чего

# Правильно:
try:
    response = requests.get(url, timeout=10)
    if response.status_code == 200:
        data = response.json()
    else:
        print("Ошибка:", response.status_code)
except requests.RequestException:
    print("Нет связи с сервером")
Зависание — нет timeout
# Сервер молчит — программа ждёт бесконечно
response = requests.get(url)

# Правильно — максимум 10 секунд:
response = requests.get(url, timeout=10)

2Ошибки в коде Python
TypeError — сложение строки и числа
temp = 12.5
print("Погода: " + temp + "°C")   # TypeError!

В Python нельзя складывать строку и число оператором +. Два способа починить:

# Способ 1: f-строка (рекомендуется)
print(f"Погода: {temp}°C")

# Способ 2: явное преобразование
print("Погода: " + str(temp) + "°C")
AttributeError — точка вместо квадратных скобок
data = {"city": "Москва"}
print(data.city)    # AttributeError!
print(data["city"])  # правильно

В Python словари не поддерживают доступ через точку. Только через квадратные скобки: data["ключ"].


3Ошибки в работе с файлами
FileNotFoundError — папки не существует
# Если папки history/ нет — программа упадёт
f = open("history/2026-04-15.txt", "w")

Перед записью нужно убедиться, что папка существует:

import os
os.makedirs("history", exist_ok=True)  # создаст, если нет

Перед чтением — что файл существует:

filename = "history/" + d + ".txt"
if os.path.exists(filename):
    with open(filename, encoding="utf-8") as f:
        print(f.read())
else:
    print("Нет сводки за", d)
Файл не закрывается
# Плохо — данные могут не записаться
f = open("report.txt", "w")
f.write(text)
# забыли f.close()

# Хорошо — with закрывает автоматически
with open("report.txt", "w", encoding="utf-8") as f:
    f.write(text)
Невалидный ввод даты
# Пользователь ввёл "вчера" — программа пытается открыть
# файл history/вчера.txt — его нет

# Решение: проверять существование файла
d = input("Дата (ГГГГ-ММ-ДД): ").strip()
filename = "history/" + d + ".txt"
if os.path.exists(filename):
    with open(filename, encoding="utf-8") as f:
        print(f.read())
else:
    print("Нет сводки за эту дату")

4Ошибки в логике программы

Эти баги не вызывают трейсбэк — программа не падает. Но пользователь получает странное поведение.

Меню без else
while True:
    choice = input("> ")
    if choice == "1":
        update()
    elif choice == "0":
        break
    # ввели "abc" — ничего не произошло, молчание

Пользователь не понимает, что ввёл не то. Добавьте else:

    else:
        print("Неизвестная команда. Введите 0 или 1.")
Один API ломает весь дашборд
# Плохо: три блока в одной функции без защиты
def show_dashboard():
    weather = requests.get(weather_url).json()
    print("Погода:", weather["current"]["temperature_2m"])

    currencies = requests.get(cbr_url).json()    # если упадёт здесь...
    print("USD:", currencies["Valute"]["USD"]["Value"])

    fact = requests.get(cat_url).json()           # ...это не выполнится
    print("Факт:", fact["fact"])

Если второй API упал — третий блок не покажется, меню не появится, программа упадёт. Нужно изолировать каждый блок:

# Хорошо: каждый блок в своём try/except
def show_weather():
    try:
        data = requests.get(weather_url, timeout=10).json()
        print("Погода:", data["current"]["temperature_2m"])
    except Exception:
        print("Погода: нет данных")

def show_currencies():
    try:
        data = requests.get(cbr_url, timeout=10).json()
        print("USD:", data["Valute"]["USD"]["Value"])
    except Exception:
        print("Валюты: нет данных")

# Один упал — остальные работают
show_weather()
show_currencies()
show_fact()
Пустой ввод и Ctrl+C
# Пользователь просто нажал Enter — пустая строка
# Или нажал Ctrl+C — KeyboardInterrupt

# Защита от обоих:
try:
    while True:
        choice = input("> ").strip()
        if not choice:
            continue            # пустой ввод — повторить
        if choice == "0":
            print("До завтра!")
            break
        # ... остальные команды
        else:
            print("Неизвестная команда")
except KeyboardInterrupt:
    print("\nВыход")

5Чек-лист перед сдачей

Перед тем как сдавать проект, пройдите по этому списку. Каждый пункт — это тест, который может провести сосед или учитель.

Запуск
  Программа запускается без ошибок?
  Появляется дашборд с данными?

Меню
  Все команды работают?
  Ввод буквы вместо цифры — сообщение, не падение?
  Пустой Enter — не падает?

Сеть
  Отключить Wi-Fi, нажать обновить — сообщение, не трейсбэк?
  Включить обратно — восстанавливается?
  Если один API лёг — остальные блоки показываются?

Файлы
  Сохранить сводку — файл появился?
  Загрузить по дате — показывает?
  Несуществующая дата — сообщение, не падение?

Внешний вид
  Рамки не съехали?
  Цвет осмысленный?
  Понятно, что делает каждый блок?
Правило. Если программа может упасть — она упадёт. Не у тебя, так у того, кто будет её тестировать. Каждый непойманный баг — это минус балл по критерию «устойчивость» на защите.
© SilverTests.ru · Памятка · Типичные ошибки в проекте
Печать