feat:精细化事件错误

This commit is contained in:
jxxghp
2025-08-26 08:41:47 +08:00
parent 7b7fb6cc82
commit b8e0c0db9e
+58 -38
View File
@@ -450,10 +450,7 @@ class EventManager(metaclass=Singleton):
logger.debug(f"Handler {self.__get_handler_identifier(handler)} is disabled. Skipping execution") logger.debug(f"Handler {self.__get_handler_identifier(handler)} is disabled. Skipping execution")
return return
try: self.__invoke_handler_by_type_sync(handler, event)
self.__invoke_handler_by_type_sync(handler, event)
except Exception as e:
self.__handle_event_error(event, handler, e)
async def __safe_invoke_handler_async(self, handler: Callable, event: 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") logger.debug(f"Handler {self.__get_handler_identifier(handler)} is disabled. Skipping execution")
return return
try: await self.__invoke_handler_by_type_async(handler, event)
await self.__invoke_handler_by_type_async(handler, event)
except Exception as e:
self.__handle_event_error(event, handler, e)
def __invoke_handler_by_type_sync(self, handler: Callable, event: 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(): 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(): elif class_name in module_manager.get_module_ids():
# 模块处理器 # 模块处理器
module = module_manager.get_running_module(class_name) module = module_manager.get_running_module(class_name)
@@ -495,16 +499,24 @@ class EventManager(metaclass=Singleton):
method = getattr(module, method_name, None) method = getattr(module, method_name, None)
if not method: if not method:
return 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: else:
# 全局处理器 # 全局处理器
class_obj = self.__get_class_instance(class_name) class_obj = self.__get_class_instance(class_name)
if not class_obj or not hasattr(class_obj, method_name): if not class_obj or not hasattr(class_obj, method_name):
return return
method = getattr(class_obj, method_name) method = getattr(class_obj, method_name, None)
if not method: if not method:
return 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): async def __invoke_handler_by_type_async(self, handler: Callable, event: Event):
""" """
@@ -537,52 +549,62 @@ class EventManager(metaclass=Singleton):
names = handler.__qualname__.split(".") names = handler.__qualname__.split(".")
return names[0], names[1] return names[0], names[1]
@staticmethod async def __invoke_plugin_method_async(self, handler: Any, class_name: str, method_name: str, event: Event):
async def __invoke_plugin_method_async(handler: Any, class_name: str, method_name: str, event: Event):
""" """
异步调用插件方法 异步调用插件方法
""" """
plugin = handler.running_plugins.get(class_name) plugin = handler.running_plugins.get(class_name)
if plugin and hasattr(plugin, method_name): if not plugin:
method = getattr(plugin, method_name) return
method = getattr(plugin, method_name, None)
if not method:
return
try:
if inspect.iscoroutinefunction(method): if inspect.iscoroutinefunction(method):
await method(event) await method(event)
else: else:
# 插件同步函数在异步环境中运行,避免阻塞 # 插件同步函数在异步环境中运行,避免阻塞
await run_in_threadpool(method, event) 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(self, handler: Any, class_name: str, method_name: str, event: Event):
async def __invoke_module_method_async(handler: Any, class_name: str, method_name: str, event: Event):
""" """
异步调用模块方法 异步调用模块方法
""" """
module = handler.get_running_module(class_name) module = handler.get_running_module(class_name)
if not module: if not module:
return return
method = getattr(module, method_name, None) method = getattr(module, method_name, None)
if not method: if not method:
return return
try:
if inspect.iscoroutinefunction(method): if inspect.iscoroutinefunction(method):
await method(event) await method(event)
else: else:
method(event) 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): async def __invoke_global_method_async(self, class_name: str, method_name: str, event: Event):
""" """
异步调用全局对象方法 异步调用全局对象方法
""" """
class_obj = self.__get_class_instance(class_name) class_obj = self.__get_class_instance(class_name)
if not class_obj or not hasattr(class_obj, method_name): if not class_obj:
return return
method = getattr(class_obj, method_name, None)
method = getattr(class_obj, method_name) if not method:
return
if inspect.iscoroutinefunction(method): try:
await method(event) if inspect.iscoroutinefunction(method):
else: await method(event)
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 @staticmethod
def __get_class_instance(class_name: str): def __get_class_instance(class_name: str):
@@ -653,18 +675,16 @@ class EventManager(metaclass=Singleton):
""" """
logger.debug(f"{stage} - {event}") 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()}") logger.error(f"{module_name} 事件处理出错:{str(e)} - {traceback.format_exc()}")
names = handler.__qualname__.split(".")
class_name, method_name = names[0], names[1]
# 发送系统错误通知 # 发送系统错误通知
from app.helper.message import MessageHelper 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)}", message=f"{class_name}.{method_name}{str(e)}",
role="system") role="system")
self.send_event( self.send_event(