From fb2672732de0283327e6722d477b48197aeb0e30 Mon Sep 17 00:00:00 2001 From: machka-pasla Date: Fri, 29 Aug 2025 12:10:00 +0300 Subject: [PATCH] Improve error handling in user interaction responses - Refactored the handling of callback answers and message responses to include try-except blocks, ensuring that exceptions are caught and logged without disrupting the user experience. - Updated message sending methods to utilize the `answer` method consistently, enhancing the reliability of user notifications in various scenarios. --- bot/handlers/user/start.py | 23 +++++----- bot/handlers/user/trial_handler.py | 70 ++++++++++++++++++++---------- 2 files changed, 59 insertions(+), 34 deletions(-) diff --git a/bot/handlers/user/start.py b/bot/handlers/user/start.py index 815934b..0c25f17 100644 --- a/bot/handlers/user/start.py +++ b/bot/handlers/user/start.py @@ -43,10 +43,9 @@ async def send_main_menu(target_event: Union[types.Message, await target_event.answer(err_msg_fallback, show_alert=True) except Exception: pass - elif isinstance(target_event, types.Message) and hasattr( - target_event, 'chat') and target_event.chat: + elif isinstance(target_event, types.Message): try: - await target_event.chat.send_message(err_msg_fallback) + await target_event.answer(err_msg_fallback) except Exception: pass return @@ -93,23 +92,27 @@ async def send_main_menu(target_event: Union[types.Message, await target_message_obj.answer(text, reply_markup=reply_markup) if isinstance(target_event, types.CallbackQuery): - await target_event.answer() + try: + await target_event.answer() + except Exception: + pass except Exception as e_send_edit: logging.warning( f"Failed to send/edit main menu (user: {user_id}, is_edit: {is_edit}): {type(e_send_edit).__name__} - {e_send_edit}." ) - if is_edit and target_message_obj and hasattr( - target_message_obj, 'chat') and target_message_obj.chat: + if is_edit and target_message_obj: try: - await target_message_obj.chat.send_message( - text, reply_markup=reply_markup) + await target_message_obj.answer(text, reply_markup=reply_markup) except Exception as e_send_new: logging.error( f"Also failed to send new main menu message for user {user_id}: {e_send_new}" ) if isinstance(target_event, types.CallbackQuery): - await target_event.answer( - _("error_occurred_try_again") if is_edit else None) + try: + await target_event.answer( + _("error_occurred_try_again") if is_edit else None) + except Exception: + pass @router.message(CommandStart()) diff --git a/bot/handlers/user/trial_handler.py b/bot/handlers/user/trial_handler.py index 043fb18..34d2e4f 100644 --- a/bot/handlers/user/trial_handler.py +++ b/bot/handlers/user/trial_handler.py @@ -31,7 +31,10 @@ async def request_trial_confirmation_handler( _ = lambda key, **kwargs: i18n.gettext(current_lang, key, **kwargs) if i18n else key if not i18n or not callback.message: - await callback.answer(_("error_occurred_try_again"), show_alert=True) + try: + await callback.answer(_("error_occurred_try_again"), show_alert=True) + except Exception: + pass return show_trial_btn_in_menu_if_fail = False @@ -46,7 +49,10 @@ async def request_trial_confirmation_handler( current_lang, i18n, settings, False ), ) - await callback.answer() + try: + await callback.answer() + except Exception: + pass return if await subscription_service.has_had_any_subscription(session, user_id): @@ -56,7 +62,10 @@ async def request_trial_confirmation_handler( current_lang, i18n, settings, False ), ) - await callback.answer() + try: + await callback.answer() + except Exception: + pass return # Directly activate trial without confirmation @@ -68,7 +77,10 @@ async def request_trial_confirmation_handler( show_trial_button_after_action = False if activation_result and activation_result.get("activated"): - await callback.answer(_("trial_activated_alert"), show_alert=True) + try: + await callback.answer(_("trial_activated_alert"), show_alert=True) + except Exception: + pass end_date_obj = activation_result.get("end_date") config_link_for_trial = activation_result.get("subscription_url") or _( @@ -106,7 +118,10 @@ async def request_trial_confirmation_handler( else "trial_activation_failed" ) final_message_text_in_chat = _(message_key_from_service) - await callback.answer(final_message_text_in_chat, show_alert=True) + try: + await callback.answer(final_message_text_in_chat, show_alert=True) + except Exception: + pass if ( settings.TRIAL_ENABLED and not await subscription_service.has_had_any_subscription( @@ -129,12 +144,8 @@ async def request_trial_confirmation_handler( f"Could not edit trial result message: {e_edit}. Sending new one." ) - if ( - callback.message - and hasattr(callback.message, "chat") - and callback.message.chat - ): - await callback.message.chat.send_message( + if callback.message: + await callback.message.answer( final_message_text_in_chat, parse_mode="HTML", reply_markup=get_main_menu_inline_keyboard( @@ -160,20 +171,29 @@ async def confirm_activate_trial_handler( _ = lambda key, **kwargs: i18n.gettext(current_lang, key, **kwargs) if i18n else key if not i18n or not callback.message: - await callback.answer(_("error_occurred_try_again"), show_alert=True) + try: + await callback.answer(_("error_occurred_try_again"), show_alert=True) + except Exception: + pass return if not settings.TRIAL_ENABLED: - await callback.answer(_("trial_feature_disabled"), show_alert=True) + try: + await callback.answer(_("trial_feature_disabled"), show_alert=True) + except Exception: + pass await send_main_menu( callback, settings, i18n_data, subscription_service, session, is_edit=True ) return if await subscription_service.has_had_any_subscription(session, user_id): - await callback.answer( - _("trial_already_had_subscription_or_trial"), show_alert=True - ) + try: + await callback.answer( + _("trial_already_had_subscription_or_trial"), show_alert=True + ) + except Exception: + pass await send_main_menu( callback, settings, i18n_data, subscription_service, session, is_edit=True ) @@ -187,7 +207,10 @@ async def confirm_activate_trial_handler( show_trial_button_after_action = False if activation_result and activation_result.get("activated"): - await callback.answer(_("trial_activated_alert"), show_alert=True) + try: + await callback.answer(_("trial_activated_alert"), show_alert=True) + except Exception: + pass end_date_obj = activation_result.get("end_date") config_link_for_trial = activation_result.get("subscription_url") or _( @@ -221,7 +244,10 @@ async def confirm_activate_trial_handler( else "trial_activation_failed" ) final_message_text_in_chat = _(message_key_from_service) - await callback.answer(final_message_text_in_chat, show_alert=True) + try: + await callback.answer(final_message_text_in_chat, show_alert=True) + except Exception: + pass if ( settings.TRIAL_ENABLED and not await subscription_service.has_had_any_subscription( @@ -244,12 +270,8 @@ async def confirm_activate_trial_handler( f"Could not edit trial result message: {e_edit}. Sending new one." ) - if ( - callback.message - and hasattr(callback.message, "chat") - and callback.message.chat - ): - await callback.message.chat.send_message( + if callback.message: + await callback.message.answer( final_message_text_in_chat, parse_mode="HTML", reply_markup=get_main_menu_inline_keyboard(