Как определить, что в объекте 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 (не те евенты) <br/> Теперь все не нужные отсеиваются. (просто пропускаются) <br/> считаю такой вариант хороший, но возможно есть вариант получше. <br/> <br/> <pre><code class="python">if not event.message_id or not event.text: return await handler(event, data)
else: pass</code></pre> <br/> <br/> UPD: Еще можно поменять типы в __call__: <br/> <pre><code class="python">from aiogram.types import Message

async def __call__(
            self, 
            handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], 
            event: Message, 
            data: Dict[str, Any],
        ) -&gt; Any:</code></pre> <br/> Но это не отсеивает event'ы т.к даже то что чел исключает чела имеет message_id (структуру сообщения), поэтому верхний if все равно нужен. И то не факт что где то что то может и иметь такие поля, хотя как таковым сообщением не является.
Похожие вопросы