From 16622887de828b946310437aa06565bb5fb3cb4d Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Tue, 11 Mar 2025 00:47:37 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=9C=A8=E8=B0=83=E7=94=A8=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=BC=82=E5=B8=B8=E6=97=B6=E6=9B=B4=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E7=9A=84=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/pipeline/stage.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/astrbot/core/pipeline/stage.py b/astrbot/core/pipeline/stage.py index f1f8587a6..7291dfc3e 100644 --- a/astrbot/core/pipeline/stage.py +++ b/astrbot/core/pipeline/stage.py @@ -1,6 +1,7 @@ from __future__ import annotations import abc import inspect +import traceback from astrbot.api import logger from typing import List, AsyncGenerator, Union, Awaitable from astrbot.core.platform.astr_message_event import AstrMessageEvent @@ -43,25 +44,32 @@ class Stage(abc.ABC): """调用 Handler。""" # 判断 handler 是否是类方法(通过装饰器注册的没有 __self__ 属性) ready_to_call = None + + trace_ = None + try: ready_to_call = handler(event, *args, **kwargs) - except TypeError as e: + except TypeError as _: # 向下兼容 - logger.debug(str(e)) + trace_ = traceback.format_exc() ready_to_call = handler(event, ctx.plugin_manager.context, *args, **kwargs) if isinstance(ready_to_call, AsyncGenerator): _has_yielded = False - async for ret in ready_to_call: - # 如果处理函数是生成器,返回值只能是 MessageEventResult 或者 None(无返回值) - _has_yielded = True - if isinstance(ret, (MessageEventResult, CommandResult)): - event.set_result(ret) + try: + async for ret in ready_to_call: + # 如果处理函数是生成器,返回值只能是 MessageEventResult 或者 None(无返回值) + _has_yielded = True + if isinstance(ret, (MessageEventResult, CommandResult)): + event.set_result(ret) + yield + else: + yield ret + if not _has_yielded: yield - else: - yield ret - if not _has_yielded: - yield + except Exception as e: + logger.error(f"Previous Error: {trace_}") + raise e elif inspect.iscoroutine(ready_to_call): # 如果只是一个 coroutine ret = await ready_to_call