1.概要

在平台中,如果系统出错,我们希望能够捕获错误并且显示错误的详细信息,方便我们定位错误。

2.全局错误捕获

在平台的jpaas-web-spring-boot-starter 模块中,有一个全局异常捕获类。

ExceptionHandlerAdvice

当系统出错时,如果应用没有进行捕获,那么系统也可以进行捕获。

在异常捕获后,会向前端返回 JsonResult 对象,并且使用 log4j 写错误日志。

2.1 应用进行错误捕获

如果在应用层对错误进行了捕获,那么不会进行全局的错误进行捕获。

  1. @Override
  2. protected JsonResult beforeSave(FormRule ent) {
  3. try{
  4. String pkId=ent.getId();
  5. boolean isExist=formRuleService.isExist(ent.getAlias(),pkId);
  6. if(isExist){
  7. throw new RuntimeException("测试错误");
  8. }
  9. return JsonResult.Success();
  10. }
  11. catch (Exception ex){
  12. JsonResult rtn=JsonResult.Fail("出错了");
  13. rtn.setException(ex);
  14. return rtn;
  15. }
  16. }

不然这样,可以在后端将错误进行捕获。
返回的数据为JsonResult 对象,我们可以使用 ExceptionUtil.getExceptionMessage(ex) 获取错误堆栈。

2.2 定制错误信息

2.1 节提到的错误捕获有一个问题,就是显示的错误信息不够友好,显示了一些堆栈信息,对于普通用户可以说是天书,完全看不懂提示信息。
因此我们在平台提供了一个类定制错误信息,用户调用来处理异常,可以将错误信息抛出,又可以抛出异常,这样我们就可以在前端友好的显示异常信息了。

比如脚本执行出错,我们可以这样编写代码:

  1. MessageUtil.triggerException("执行脚本出错,请检查脚本!","脚本内容:\r\n" +scriptText);

triggerException 方法有两个参数:
参数1:
错误标题
参数2:
错误消息,这个调用多次这个方法他会累加。

在全局错误捕获代码如下:

  1. @ExceptionHandler(BusinessException.class)
  2. public JsonResult handleError(BusinessException exception) {
  3. String title="系统出错了!";
  4. if(StringUtils.isNotEmpty(MessageUtil.getTitle())){
  5. title=MessageUtil.getTitle();
  6. }
  7. JsonResult result= JsonResult.Fail(title);
  8. String message= MessageUtil.getMessage();
  9. result.setData(message);
  10. return result;
  11. }

注意这个异常直接抛出来就好了,不要进行捕获。

错误信息能直接显示到前端。

2.3 前端统一显示错误信息

在前端我们使用AJAX调用时,统一对错误进行了拦截。

可以参考 jpaas-common-lib 的 ajax.js 。

  1. //有错误码时拦截
  2. const err = (error) => {
  3. MessageBox.show(error.response);
  4. return Promise.reject(error)
  5. };
  6. //当JsonResult 全局拦截
  7. if(response.data.show) {
  8. if(response.data.success){
  9. notification.success({
  10. message: '操作提示',
  11. description: response.data.message
  12. })
  13. }
  14. else{
  15. MessageBox.show(response.data);
  16. }
  17. }
文档更新时间: 2021-07-19 18:39   作者:zyg