"""Глобальный обработчик ошибок.""" 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