mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 07:27:15 +08:00
refactor: 推进后端分层架构治理
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
"""事件处理异常的通知、降级和递归保护策略。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import traceback
|
||||
from collections.abc import Callable
|
||||
from typing import Any, Optional
|
||||
|
||||
from app.runtime.log import logger
|
||||
from app.schemas.types import EventType
|
||||
|
||||
|
||||
EventErrorNotifier = Callable[[str, str], object]
|
||||
|
||||
|
||||
class EventErrorPolicy:
|
||||
"""隔离处理器异常,并阻止 SystemError 处理失败再次广播。"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
notifier: Callable[[], Optional[EventErrorNotifier]],
|
||||
emit_system_error: Callable[[dict], object],
|
||||
) -> None:
|
||||
"""注入通知读取器和 SystemError 发送回调。"""
|
||||
self._notifier = notifier
|
||||
self._emit_system_error = emit_system_error
|
||||
|
||||
def handle(
|
||||
self,
|
||||
*,
|
||||
event: Any,
|
||||
module_name: str,
|
||||
class_name: str,
|
||||
method_name: str,
|
||||
error: Exception,
|
||||
) -> None:
|
||||
"""记录并通知异常;SystemError 自身失败时只降级写日志。"""
|
||||
trace = traceback.format_exc()
|
||||
logger.error("%s 事件处理出错:%s - %s", module_name, str(error), trace)
|
||||
notifier = self._notifier()
|
||||
if notifier:
|
||||
try:
|
||||
notifier(
|
||||
f"{module_name} 处理事件 {event.event_type} 时出错",
|
||||
f"{class_name}.{method_name}:{str(error)}",
|
||||
)
|
||||
except Exception as notify_error:
|
||||
logger.error("发送事件错误通知失败:%s", str(notify_error))
|
||||
if event.event_type == EventType.SystemError:
|
||||
logger.error(
|
||||
"SystemError 处理器再次失败,停止错误事件递归广播:%s.%s",
|
||||
class_name,
|
||||
method_name,
|
||||
)
|
||||
return
|
||||
self._emit_system_error(
|
||||
{
|
||||
"type": "event",
|
||||
"event_type": event.event_type,
|
||||
"event_handle": f"{class_name}.{method_name}",
|
||||
"error": str(error),
|
||||
"traceback": trace,
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user