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

共 7155字,需浏览 15分钟

 ·

2021-03-19 11:42

往期热门文章:

1、Spring 中经典的 9 种设计模式!收藏了

2、高仿小米商城项目,爱了!

3、为什么有些公司不让用 Lombok ?

4、厉害了,为了干掉 HTTP ,Spring 团队开源了 nohttp 项目!

5、别瞎学了,这几门语言要被淘汰了!

来源:www.toutiao.com/i6878184496945070604

前言

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

推荐理由

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

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

实践

1 封装统一返回结果类

源代码

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 自定义异常封装类

源码:

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 错误枚举,拒绝硬编码

源码

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 全局异常处理类

源码

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

@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 测试

返回结果:

最近热文阅读:

1、Spring 中经典的 9 种设计模式!收藏了
2、高仿小米商城项目,爱了!
3、为什么有些公司不让用 Lombok ?
4、厉害了,为了干掉 HTTP ,Spring 团队开源了 nohttp 项目!
5、别瞎学了,这几门语言要被淘汰了!
6、一个基于 Spring Boot 的项目骨架,非常舒服!
7、Redis 低成本、高可用设计,牛逼!
8、2020年国内互联网公司的薪酬排名!
9、IDEA 真牛逼,900行 "又臭又长" 的类重构,几分钟搞定!
10、舒服!一个注解,搞定 SpringBoot 操作日志
关注公众号,你想要的Java都在这里

浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报