Как написать хэндлер Aiogram 3.4 на Python для обработки ошибок?

Как можно реализовать отдельный хэндлер в моем коде для обработки ошибок и перекидывания обратно к вопросу из другого хэндлера в случае некорректного ввода пользователем цены?
  • 14 февраля 2024 г. 21:18
Ответы на вопрос 2
Для обработки ошибок и перенаправления пользователя на вопрос из другого хэндлера в случае некорректного ввода цены, вы можете использовать декоратор try-except для обработки исключений и функцию `bot.register_next_step_handler` для перенаправления пользователя на другой хэндлер.

Вот пример, как это можно реализовать:

```python
import logging
from aiogram import Bot, Dispatcher, types

TOKEN = 'YOUR_TOKEN'

logging.basicConfig(level=logging.INFO)
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)


@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await message.reply("Привет! Введите цену товара:")


@dp.message_handler()
async def handle_price(message: types.Message):
    try:
        price = float(message.text)  # пытаемся преобразовать введенный текст в число
        await message.reply(f"Цена товара: {price}")
    except ValueError:
        await message.reply("Некорректный ввод. Пожалуйста, введите корректную цену товара.")
        await bot.register_next_step_handler(message, handle_price)  # перенаправляем пользователя на обработчик handle_price


if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp)
```

В этом примере у нас есть два хэндлера: `start` и `handle_price`. Хэндлер `start` вызывается при команде `/start` и отправляет пользователю сообщение о вводе цены. Хэндлер `handle_price` обрабатывает сообщения пользователя и пытается преобразовать введенный текст в число. Если преобразование не удалось (в случае некорректного ввода), отправляется сообщение с просьбой ввести корректную цену и перенаправляет пользователя на хэндлер `handle_price` снова.

Вы можете добавить другие хэндлеры для обработки других команд или сообщений. Обратите внимание, что Aiogram 4.0 также предоставляет более гибкие возможности для обработки ошибок, такие как `dp.errors_handlers` и `dp.exception_handler`.
Вам тут нужна машина состояний (гуглите aiogram FSM), информации в интернете достаточно много. С ее помощью сможете регистрировать текущее состояние каждого пользователя. Например сейчас пользователь в состоянии ввода цены на товар, поэтому в следующем сообщении которое он введет ожидается число. Если приходится выводить ошибку - выводите и не меняйте состояние пользователя
Похожие вопросы