定义脚本执行 API 返回报错的静态替换模板,来给用户提供自定义错误消息的功能
Closed this issue · 1 comments
ZhengshuaiPENG commented
背景
当前 Byzer 引擎执行脚本时,返回的报错信息大部分都是 stacktrace,可读性很差,用户无法获得具体信息
需求
做一套基于 文本的配置模板的方式,能够让用户定义 key - value,其中 key 可以匹配 api 返回中的error message 的文本,将value中的文件进行替代返回,增强 API 错误信息的可读性
注意
- 该文本需要在
byzer.properties
中可配置,默认为$BYZER_HOME/conf/err-msg-template.%{format}
, format 可以在技术实现中定义 - 需要考虑是否保留原始报错(比如 stacktrace)
- 返回消息中只包含模板中定义的消息,完全替换原有报错信息
- 返回消息中既能够包含新定义的消息,也包含原有报错信息,由api调用方自行选择是否展示
- 要求将报错中出现的
MLSQL error
, 统一替换为Byzer-lang error
chncaesar commented
实现思路
Byzer-lang 提供了 ExceptionRender
接口,新类实现该接口,并注册至 ExceptionRenderManager
。/run/script
接口返回错误信息前,调用 ExceptionRenderManager.call()
方法,该方法会自动调用各个注册的实现类。从而达到灵活扩展的目的。
配置文件: $BYZER_HOME/conf/err-msg-template.json
json 格式:
[
{ "regexp": "MLSQL Parser error in .*?", "msg": "MLSQL Parser error"}
]
修改点如下:
- 修改 Byzer-lang
RestController
的/run/script
, 同步和异步调用时都需要调用ExceptionRenderManager.call()
- 在 Byzer-extension 新增
ExceptionRender
实现类,实现需求描述中的逻辑 - 新增一个插件 App,启动 Byzer-lang 时注册至
ExceptionRenderManager
ExceptionRender 实现类主要逻辑:
- 读取 环境变量 $BYZER_HOME, 则打印日志继续。Fallback 至 Byzer-lang 的
DefaultExceptionRender
- is_match() 匹配函数,
e.getMessage
与regexp
匹配,成功者取msg
。由于is_match(e: Exception): Boolean
限制,msg
保存在ThreadLocal
对象。