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 лёг — остальные блоки показываются?
Файлы
Сохранить сводку — файл появился?
Загрузить по дате — показывает?
Несуществующая дата — сообщение, не падение?
Внешний вид
Рамки не съехали?
Цвет осмысленный?
Понятно, что делает каждый блок?
Правило. Если программа может упасть — она упадёт. Не у тебя, так у того, кто будет её тестировать. Каждый непойманный баг — это минус балл по критерию «устойчивость» на защите.