DispelEvilBot/bot/handlers/errors.py

40 lines
1.3 KiB
Python

"""Глобальный обработчик ошибок."""
from __future__ import annotations
import logging
from aiogram import Dispatcher
from aiogram.types import ErrorEvent
from common.analytics import EventType, record
logger = logging.getLogger(__name__)
#: Максимальная длина текста ошибки в payload события.
ERROR_TEXT_MAX = 500
def register_errors(dp: Dispatcher) -> None:
"""Зарегистрировать обработчик, чтобы одна ошибка не роняла поллинг."""
@dp.errors()
async def on_error(event: ErrorEvent) -> bool:
exc = event.exception
logger.error(
"Необработанная ошибка при обработке апдейта",
exc_info=(type(exc), exc, exc.__traceback__),
)
user = getattr(event.update, "event_from_user", None)
record(
EventType.ERROR,
user_id=getattr(user, "id", 0) or 0,
username=getattr(user, "username", None),
payload={
"error_type": type(exc).__name__,
"error": str(exc)[:ERROR_TEXT_MAX],
"update_type": str(getattr(event.update, "event_type", "") or ""),
},
)
return True