Что если интернета нет

Бот-Погода работает, пока всё хорошо. Но интернет иногда пропадает, а сервис может задуматься и не ответить. Прямо сейчас бот в такой момент падает с ошибкой и перестаёт работать. Сегодня научим его держать удар: ловить проблемы с сетью и вежливо о них сообщать.

После урока сможешь: объяснить тему «Что если интернета нет» и выполнить связанный с ней учебный шаг без подсказки.

Почему бот падает

Когда ты зовёшь requests.get(...), а интернета нет, Python не знает, что делать, и выбрасывает ошибку. Если её не поймать, программа останавливается. Для бота, который ходит в сеть постоянно, это серьёзно: один сбой, и бот молчит для всех. Хорошая новость: лекарство ты знаешь, это try/except, которым мы ловили «файла ещё нет» в прошлом модуле.

Оборачиваем запрос в защиту

def pogoda_v(shirota, dolgota):
    url = f"https://api.open-meteo.com/v1/forecast?latitude={shirota}&longitude={dolgota}&current=temperature_2m"
    try:
        data = requests.get(url, timeout=5).json()
        return data["current"]["temperature_2m"]
    except Exception:
        return None
  • try: значит «попробуй сделать вот это». Если всё хорошо, функция вернёт температуру.
  • except Exception: срабатывает, если внутри что-то сломалось: нет интернета, сервис не ответил. Вместо падения функция вернёт None, особое значение «ничего не вышло».
  • timeout=5 значит «жди ответа не дольше пяти секунд». Без него бот может зависнуть надолго, если сервис молчит.

Реагируем на None

@bot.callback_query_handler(func=lambda call: True)
def on_city(call):
    bot.answer_callback_query(call.id)
    gorod = call.data
    shirota, dolgota = goroda[gorod]
    temp = pogoda_v(shirota, dolgota)
    if temp is None:
        bot.send_message(call.message.chat.id, "Не получилось узнать погоду, попробуй позже.")
    else:
        bot.send_message(call.message.chat.id, f"В городе {gorod} сейчас {temp} градусов.")

if temp is None: это «если данных нет». Тогда бот вежливо извиняется. Иначе шлёт погоду, как обычно. Главное, бот не падает и продолжает работать для всех остальных.

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

Контрольный вопрос. Чтобы бот не падал без интернета, запрос оборачивают в конструкцию ____ / except. Напиши первое ключевое слово.

Подсказка: ____: … except Exception: …

Онлайн-проверка ответа появится позже

Задание. Оберни запрос к погоде в try/except и добавь timeout. Проверь результат на None и пошли вежливое сообщение при сбое. Проверь по-настоящему: выключи интернет и убедись, что бот не падает. Пришли скриншот, где при проблеме с сетью бот отвечает вежливо, а не валится.

Подсказка: Запрос внутри try, в except вернуть None. В обработчике: if temp is None — извиниться, иначе прислать погоду.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Зачёт, если:
✅ бот запускается без красных ошибок;
✅ по городу показывает погоду с open-meteo, а при выключенном интернете отвечает вежливо и не падает (try/except и проверка на None);
✅ проверено по-настоящему: выключал интернет;
✅ прислан скриншот, где при сбое сети бот отвечает вежливо.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева