From e17cde7c72381dc1b3daac580729f838226996a9 Mon Sep 17 00:00:00 2001 From: Zakhar Izmaylov Date: Sun, 19 Jan 2025 08:59:43 +0300 Subject: [PATCH] Update errors_handler --- bot.py | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/bot.py b/bot.py index a995ed69..2935fad1 100644 --- a/bot.py +++ b/bot.py @@ -3,10 +3,13 @@ import traceback from aiogram import Bot, Dispatcher from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode +from aiogram.exceptions import TelegramBadRequest, TelegramForbiddenError +from aiogram.filters import ExceptionTypeFilter from aiogram.fsm.storage.memory import MemoryStorage -from aiogram.types import ErrorEvent +from aiogram.types import BufferedInputFile, ErrorEvent +from aiogram.utils.markdown import hbold -from config import API_TOKEN +from config import ADMIN_ID, API_TOKEN from filters.private import IsPrivate from logger import logger from middlewares.admin import AdminMiddleware @@ -41,12 +44,29 @@ dp.message.filter(IsPrivate()) dp.callback_query.filter(IsPrivate()) -@dp.error() -async def error_handler(event: ErrorEvent): - logger.error( - "Ошибка в боте:\n" - f"Исключение: {event.exception}\n" - f"Тип: {type(event.exception)}\n" - f"Update: {event.update}\n" - f"Трассировка:\n{traceback.format_exc()}" - ) +@router.errors(ExceptionTypeFilter(Exception)) +async def errors_handler( + event: ErrorEvent, + bot: Bot, +) -> bool: + if isinstance(event.exception, TelegramForbiddenError): + logger.info(f"User {event.update.message.from_user.id} blocked the bot.") + return True + logger.exception(f"Update: {event.update}\nException: {event.exception}") + if not ADMIN_ID: + return True + try: + for admin_id in ADMIN_ID: + await bot.send_document( + chat_id=admin_id, + document=BufferedInputFile( + traceback.format_exc().encode(), + filename=f"error_{event.update.update_id}.txt", + ), + caption=f"{hbold(type(event.exception).__name__)}: {str(event.exception)[:1021]}...", + ) + except TelegramBadRequest as exception: + logger.warning(f"Failed to send error details: {exception}") + except Exception as exception: + logger.error(f"Unexpected error in error handler: {exception}") + return True