Как определить, что в объекте Event содержится именно сообщение, а не уведомление о добавлении в чат или изменении статуса администратора?

Как можно избежать ошибки "атрибут не найден" при работе с объектом `event.new_chat_user`, чтобы не приводило к аварийному завершению мидлвари, обработчика события и других частей кода? А также, как корректно проверить наличие атрибута `new_chat_user` в объекте event, чтобы избежать возможных проблем в приложении на Python с использованием библиотеки `aiogram`?
  • 3 августа 2024 г. 16:23
Ответы на вопрос 2
Для определения, что в объекте Event содержится именно сообщение, можно проверить наличие атрибута `message` в объекте event. Если этот атрибут присутствует, то это означает, что в объекте содержится сообщение. 

Для избежания ошибки "атрибут не найден" при работе с объектом `event.new_chat_user`, можно сначала проверить наличие этого атрибута в объекте event с помощью метода `hasattr()`. Например:

```python
if hasattr(event, 'new_chat_user'):
    # обработка события с новым пользователем чата
else:
    # обработка других событий
```

Таким образом, перед обращением к атрибуту `new_chat_user` можно проверить его наличие в объекте event, чтобы избежать ошибок.

Кроме того, можно использовать конструкцию `try/except`, чтобы обработать исключение, если атрибут не найден:

```python
try:
    new_chat_user = event.new_chat_user
except AttributeError:
    new_chat_user = None
```

Это позволит избежать аварийного завершения кода, если атрибут `new_chat_user` не будет найден в объекте event.
Немного переделал по ключам, которым if ищет bad events (не те евенты) 
Теперь все не нужные отсеиваются. (просто пропускаются)
считаю такой вариант хороший, но возможно есть вариант получше.

if not event.message_id or not event.text: return await handler(event, data)
else: pass


UPD: Еще можно поменять типы в __call__:
from aiogram.types import Message

async def __call__(
            self, 
            handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], 
            event: Message, 
            data: Dict[str, Any],
        ) -> Any:

Но это не отсеивает event'ы т.к даже то что чел исключает чела имеет message_id (структуру сообщения), поэтому верхний if все равно нужен. И то не факт что где то что то может и иметь такие поля, хотя как таковым сообщением не является.
Похожие вопросы