mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
feat:精细化事件错误
This commit is contained in:
+58
-38
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user