Найти в Дзене

Факапы разработчика, день 5


💥 Ошибка, которая научила меня проверять данные
Программирование — это как готовка: если ингредиенты не те, блюдо не получится. После прошлых факапов я решил, что теперь буду внимательнее к мелочам. Но оказалось, что можно облажаться не только с кодом, но и с тем, что в него приходит.

📌 Ситуация
Я работал над небольшим веб-приложением на Flask. Нужно было сделать страницу, где пользователь вводит число, а сервер возвращает его факториал. Простая задачка: получаем число из формы, вычисляем факториал, показываем результат. Написал код, протестировал с парой чисел — всё работает, страница выдаёт правильные ответы.
Но потом я заметил, что при некоторых запросах приложение возвращает странные результаты или падает с ошибкой. Например, ввожу 5 — всё ок, ввожу 10 — тоже ок, а ввожу 0 или отрицательное число — всё ломается.

🔎 День копания в коде
Я начал проверять код. Вот как выглядела моя функция:

def factorial(n):
--if n == 0:
----return 1
--return n * factorial(n - 1)

Казалось бы, всё правильно: для 0 возвращаем 1, для остальных чисел — рекурсия. Я добавил логи, чтобы посмотреть, что приходит в функцию. Оказалось, что проблема возникает, когда пользователь вводит отрицательное число или что-то нечислового типа, например, буквы. Но почему-то я был уверен, что Flask сам проверяет входные данные.
Я полез в код формы и увидел, что беру данные напрямую:

number = request.form['number']
result = factorial(number)

Добавил проверку, чтобы преобразовать number в число:

number = int(request.form['number'])

Но это не решило проблему полностью: если пользователь вводил буквы, приложение всё равно падало с ошибкой ValueError.

🤯 В чём была проблема
После дня дебаггинга я понял, что я вообще не проверял входные данные должным образом. Я предполагал, что пользователь всегда введёт корректное число, но в реальной жизни это не так. Нужно было добавить полную валидацию:

try:
--number = int(request.form['number'])
--if number < 0:
----return "Ошибка: число должно быть неотрицательным"
--result = factorial(number)
--return f"Факториал: {result}"
except ValueError:
--return "Ошибка: введите число"
Эта проверка решила всё: приложение перестало падать, а пользователю показывалось понятное сообщение об ошибке.

🎯 Вывод
Эта ошибка отняла у меня день, потому что я был слишком наивным. Что я вынес:

Никогда не доверяй входным данным. Пользователи могут ввести что угодно — буквы, пробелы, эмодзи.
Добавляй валидацию на старте. Проверка типов и значений должна быть до любой логики.
Делай понятные сообщения об ошибках. Это спасает и пользователя, и тебя от головной боли.

🚀 Итог
Теперь я всегда начинаю с проверки входных данных, даже если кажется, что это «простая задачка». Приложение теперь работает стабильно, а я добавил ещё и верхний лимит на число, чтобы рекурсия не уронила сервер. И знаете, теперь я даже рад, когда вижу сообщение об ошибке — значит, я предусмотрел этот случай. 😄
Факапы разработчика, день 5  💥 Ошибка, которая научила меня проверять данные Программирование — это как готовка: если ингредиенты не те, блюдо не получится.
2 минуты