From b8e0c0db9ea697084d843477a96fb53a410d87cd Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 26 Aug 2025 08:41:47 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E7=B2=BE=E7=BB=86=E5=8C=96?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/event.py | 96 ++++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/app/core/event.py b/app/core/event.py index 37d9e8df..37defeaf 100644 --- a/app/core/event.py +++ b/app/core/event.py @@ -450,10 +450,7 @@ class EventManager(metaclass=Singleton): logger.debug(f"Handler {self.__get_handler_identifier(handler)} is disabled. Skipping execution") return - try: - self.__invoke_handler_by_type_sync(handler, event) - except Exception as e: - self.__handle_event_error(event, handler, e) + self.__invoke_handler_by_type_sync(handler, event) async def __safe_invoke_handler_async(self, handler: Callable, event: Event): """ @@ -465,10 +462,7 @@ class EventManager(metaclass=Singleton): logger.debug(f"Handler {self.__get_handler_identifier(handler)} is disabled. Skipping execution") return - try: - await self.__invoke_handler_by_type_async(handler, event) - except Exception as e: - self.__handle_event_error(event, handler, e) + await self.__invoke_handler_by_type_async(handler, event) def __invoke_handler_by_type_sync(self, handler: Callable, event: Event): """ @@ -486,7 +480,17 @@ class EventManager(metaclass=Singleton): if class_name in plugin_manager.get_plugin_ids(): # 插件处理器 - plugin_manager.run_plugin_method(class_name, method_name, event) + plugin = plugin_manager.running_plugins.get(class_name) + if not plugin: + return + method = getattr(plugin, method_name, None) + if not method: + return + try: + method(event) + except Exception as e: + self.__handle_event_error(event=event, module_name=plugin.name, + class_name=class_name, method_name=method_name, e=e) elif class_name in module_manager.get_module_ids(): # 模块处理器 module = module_manager.get_running_module(class_name) @@ -495,16 +499,24 @@ class EventManager(metaclass=Singleton): method = getattr(module, method_name, None) if not method: return - method(event) + try: + method(event) + except Exception as e: + self.__handle_event_error(event=event, module_name=module.get_name(), + class_name=class_name, method_name=method_name, e=e) else: # 全局处理器 class_obj = self.__get_class_instance(class_name) if not class_obj or not hasattr(class_obj, method_name): return - method = getattr(class_obj, method_name) + method = getattr(class_obj, method_name, None) if not method: return - method(event) + try: + method(event) + except Exception as e: + self.__handle_event_error(event=event, module_name=class_name, + class_name=class_name, method_name=method_name, e=e) async def __invoke_handler_by_type_async(self, handler: Callable, event: Event): """ @@ -537,52 +549,62 @@ class EventManager(metaclass=Singleton): names = handler.__qualname__.split(".") return names[0], names[1] - @staticmethod - async def __invoke_plugin_method_async(handler: Any, class_name: str, method_name: str, event: Event): + async def __invoke_plugin_method_async(self, handler: Any, class_name: str, method_name: str, event: Event): """ 异步调用插件方法 """ plugin = handler.running_plugins.get(class_name) - if plugin and hasattr(plugin, method_name): - method = getattr(plugin, method_name) + if not plugin: + return + method = getattr(plugin, method_name, None) + if not method: + return + try: if inspect.iscoroutinefunction(method): await method(event) else: # 插件同步函数在异步环境中运行,避免阻塞 await run_in_threadpool(method, event) + except Exception as e: + self.__handle_event_error(event=event, handler=handler, e=e, module_name=plugin.name) - @staticmethod - async def __invoke_module_method_async(handler: Any, class_name: str, method_name: str, event: Event): + async def __invoke_module_method_async(self, handler: Any, class_name: str, method_name: str, event: Event): """ 异步调用模块方法 """ module = handler.get_running_module(class_name) if not module: return - method = getattr(module, method_name, None) if not method: return - - if inspect.iscoroutinefunction(method): - await method(event) - else: - method(event) + try: + if inspect.iscoroutinefunction(method): + await method(event) + else: + method(event) + except Exception as e: + self.__handle_event_error(event=event, module_name=module.get_name(), + class_name=class_name, method_name=method_name, e=e) async def __invoke_global_method_async(self, class_name: str, method_name: str, event: Event): """ 异步调用全局对象方法 """ class_obj = self.__get_class_instance(class_name) - if not class_obj or not hasattr(class_obj, method_name): + if not class_obj: return - - method = getattr(class_obj, method_name) - - if inspect.iscoroutinefunction(method): - await method(event) - else: - method(event) + method = getattr(class_obj, method_name, None) + if not method: + return + try: + if inspect.iscoroutinefunction(method): + await method(event) + else: + method(event) + except Exception as e: + self.__handle_event_error(event=event, module_name=class_name, + class_name=class_name, method_name=method_name, e=e) @staticmethod def __get_class_instance(class_name: str): @@ -653,18 +675,16 @@ class EventManager(metaclass=Singleton): """ logger.debug(f"{stage} - {event}") - def __handle_event_error(self, event: Event, handler: Callable, e: Exception): + def __handle_event_error(self, event: Event, module_name: str, + class_name: str, method_name: str, e: Exception): """ 全局错误处理器,用于处理事件处理中的异常 """ - logger.error(f"事件处理出错:{str(e)} - {traceback.format_exc()}") - - names = handler.__qualname__.split(".") - class_name, method_name = names[0], names[1] + logger.error(f"{module_name} 事件处理出错:{str(e)} - {traceback.format_exc()}") # 发送系统错误通知 from app.helper.message import MessageHelper - MessageHelper().put(title=f"{event.event_type} 事件处理出错", + MessageHelper().put(title=f"{module_name} 处理事件 {event.event_type} 时出错", message=f"{class_name}.{method_name}:{str(e)}", role="system") self.send_event(