43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""Decorators and utility functions for private handlers"""
|
|
|
|
# Standard library imports
|
|
import traceback
|
|
from typing import Any, Callable
|
|
|
|
# Third-party imports
|
|
from aiogram import types
|
|
|
|
# Local imports
|
|
from logs.custom_logger import logger
|
|
|
|
|
|
def error_handler(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
"""Decorator for centralized error handling"""
|
|
|
|
async def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
try:
|
|
return await func(*args, **kwargs)
|
|
except Exception as e:
|
|
logger.error(f"Error in {func.__name__}: {str(e)}")
|
|
# Try to send error to logs if possible
|
|
try:
|
|
message = next(
|
|
(arg for arg in args if isinstance(arg, types.Message)), None
|
|
)
|
|
if message and hasattr(message, "bot"):
|
|
from helper_bot.utils.base_dependency_factory import \
|
|
get_global_instance
|
|
|
|
bdf = get_global_instance()
|
|
important_logs = bdf.settings["Telegram"]["important_logs"]
|
|
await message.bot.send_message(
|
|
chat_id=important_logs,
|
|
text=f"Произошла ошибка в {func.__name__}: {str(e)}\n\nTraceback:\n{traceback.format_exc()}",
|
|
)
|
|
except Exception:
|
|
# If we can't log the error, at least it was logged to logger
|
|
pass
|
|
raise
|
|
|
|
return wrapper
|