1.概要
在平台中,如果系统出错,我们希望能够捕获错误并且显示错误的详细信息,方便我们定位错误。
2.全局错误捕获
在平台的jpaas-web-spring-boot-starter 模块中,有一个全局异常捕获类。
ExceptionHandlerAdvice
当系统出错时,如果应用没有进行捕获,那么系统也可以进行捕获。
在异常捕获后,会向前端返回 JsonResult 对象,并且使用 log4j 写错误日志。
2.1 应用进行错误捕获
如果在应用层对错误进行了捕获,那么不会进行全局的错误进行捕获。
@Override
protected JsonResult beforeSave(FormRule ent) {
try{
String pkId=ent.getId();
boolean isExist=formRuleService.isExist(ent.getAlias(),pkId);
if(isExist){
throw new RuntimeException("测试错误");
}
return JsonResult.Success();
}
catch (Exception ex){
JsonResult rtn=JsonResult.Fail("出错了");
rtn.setException(ex);
return rtn;
}
}
不然这样,可以在后端将错误进行捕获。
返回的数据为JsonResult 对象,我们可以使用 ExceptionUtil.getExceptionMessage(ex) 获取错误堆栈。
2.2 定制错误信息
2.1 节提到的错误捕获有一个问题,就是显示的错误信息不够友好,显示了一些堆栈信息,对于普通用户可以说是天书,完全看不懂提示信息。
因此我们在平台提供了一个类定制错误信息,用户调用来处理异常,可以将错误信息抛出,又可以抛出异常,这样我们就可以在前端友好的显示异常信息了。
比如脚本执行出错,我们可以这样编写代码:
MessageUtil.triggerException("执行脚本出错,请检查脚本!","脚本内容:\r\n" +scriptText);
triggerException 方法有两个参数:
参数1:
错误标题
参数2:
错误消息,这个调用多次这个方法他会累加。
在全局错误捕获代码如下:
@ExceptionHandler(BusinessException.class)
public JsonResult handleError(BusinessException exception) {
String title="系统出错了!";
if(StringUtils.isNotEmpty(MessageUtil.getTitle())){
title=MessageUtil.getTitle();
}
JsonResult result= JsonResult.Fail(title);
String message= MessageUtil.getMessage();
result.setData(message);
return result;
}
注意这个异常直接抛出来就好了,不要进行捕获。
错误信息能直接显示到前端。
2.3 前端统一显示错误信息
在前端我们使用AJAX调用时,统一对错误进行了拦截。
可以参考 jpaas-common-lib 的 ajax.js 。
//有错误码时拦截
const err = (error) => {
MessageBox.show(error.response);
return Promise.reject(error)
};
//当JsonResult 全局拦截
if(response.data.show) {
if(response.data.success){
notification.success({
message: '操作提示',
description: response.data.message
})
}
else{
MessageBox.show(response.data);
}
}
文档更新时间: 2021-07-19 18:39 作者:zyg