40 lines
1.3 KiB
Python
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
|