统一处理 try...catch 这么香,求求你不要再满屏写了,再发现扣绩效!

开发者技术前线

共 3733字,需浏览 8分钟

 ·

2021-07-20 23:11

点击“开发者技术前线”,选择“星标🔝”

让一部分开发者看到未来

1fd88ca3752803691a05625dcc6c6feb.webp

责编:乐乐 | 来自:小李子说程序

链接:urlify.cn/6naQjq


前言

软件开发springboot项目过程中,不可避免的需要处理各种异常,spring mvc 架构中各层会出现大量的try {...} catch {...} finally {...}代码块,不仅有大量的冗余代码,而且还影响代码的可读性。这样就需要定义个全局统一异常处理器,以便业务层再也不必处理异常。

推荐理由

  • 代码复制到项目中通过简单的配置即可实现

  • 可以灵活的根据自己的业务异常进行更细粒度的扩展

实践

1 封装统一返回结果类

2bbe1f3bce0ed69aa9941cb6ff54dc4b.webp

源代码

public class AjaxResult {
 //是否成功
    private Boolean success;
    //状态码
    private Integer code;
    //提示信息
    private String msg;
    //数据
    private Object data;
    public AjaxResult() {

    }
    //自定义返回结果的构造方法
    public AjaxResult(Boolean success,Integer code, String msg,Object data) {
        this.success = success;
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    //自定义异常返回的结果
    public static AjaxResult defineError(BusinessException de){
     AjaxResult result = new AjaxResult();
        result.setSuccess(false);
        result.setCode(de.getErrorCode());
        result.setMsg(de.getErrorMsg());
        result.setData(null);
        return result;
    }
    //其他异常处理方法返回的结果
    public static AjaxResult otherError(ErrorEnum errorEnum){
     AjaxResult result = new AjaxResult();
        result.setMsg(errorEnum.getErrorMsg());
        result.setCode(errorEnum.getErrorCode());
        result.setSuccess(false);
        result.setData(null);
        return result;
    }
 public Boolean getSuccess() {
  return success;
 }
 public void setSuccess(Boolean success) {
  this.success = success;
 }
 public Integer getCode() {
  return code;
 }
 public void setCode(Integer code) {
  this.code = code;
 }
 public String getMsg() {
  return msg;
 }
 public void setMsg(String msg) {
  this.msg = msg;
 }
 public Object getData() {
  return data;
 }
 public void setData(Object data) {
  this.data = data;
 }
    
}

2 自定义异常封装类

b5099a6df4546953633716d777e6033d.webp

源码:

public class BusinessException extends RuntimeException {
 private static final long serialVersionUID = 1L;
 /**
  * 错误状态码
  */

 protected Integer errorCode;
 /**
  * 错误提示
  */

 protected String errorMsg;

 public BusinessException(){

     }

 public BusinessException(Integer errorCode, String errorMsg) {
         this.errorCode = errorCode;
         this.errorMsg = errorMsg;
     }

 public Integer getErrorCode() {
  return errorCode;
 }

 public void setErrorCode(Integer errorCode) {
  this.errorCode = errorCode;
 }

 public String getErrorMsg() {
  return errorMsg;
 }

 public void setErrorMsg(String errorMsg) {
  this.errorMsg = errorMsg;
 }
}

3 错误枚举,拒绝硬编码

c063bbc3136ccb6951ef88a77088fdca.webp

源码

搜索公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。

public enum ErrorEnum {
 // 数据操作错误定义
 SUCCESS(200"成功"),
 NO_PERMISSION(403,"你没得权限"),
 NO_AUTH(401,"未登录"),
 NOT_FOUND(404"未找到该资源!"),
 INTERNAL_SERVER_ERROR(500"服务器异常请联系管理员"),
 ;

 /** 错误码 */
 private Integer errorCode;

 /** 错误信息 */
 private String errorMsg;

 ErrorEnum(Integer errorCode, String errorMsg) {
  this.errorCode = errorCode;
  this.errorMsg = errorMsg;
 }

    public Integer getErrorCode() {
        return errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }
}

4 全局异常处理类

43db35468c965e1d701d0a0f0dbbd8e7.webp

源码

/**
 * 全局异常处理器
 * 
 */

@RestControllerAdvice
public class GlobalExceptionHandler
{
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);



    /**
     * 处理自定义异常
     *
     */

    @ExceptionHandler(value = BusinessException.class)
    public AjaxResult bizExceptionHandler(BusinessException e
{
     log.error(e.getMessage(), e);
        return AjaxResult.defineError(e);
    }

    /**
     *处理其他异常
     *
     */

    @ExceptionHandler(value = Exception.class)
    public AjaxResult exceptionHandlerException e
{
      log.error(e.getMessage(), e);
        return AjaxResult.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
       
    }

}

5 测试

9bd62f3d0f41081136664e27e1766ea3.webp

返回结果:

c59259b0e8b55af57f2f32f349e7b3ec.webp

—  —

点这里👇关注我,记得标星呀~


前线推出学习交流一定要备注:研究/工作方向+地点+学校/公司+昵称(如JAVA+上海

扫码加小编微信,进群和大佬们零距离



END

后台回复“电子书” “资料” 领取一份干货,数百面试手册等
历史推荐


谷歌内部代码评审规范完整版出炉!

三款主流的 JSON 解析库性能大比拼,到底谁最牛?

API设计得好,下班下得早


好文点个在看吧!
浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报