不要再满屏写 try...catch 了!这个更香!

Java后端技术

共 7123字,需浏览 15分钟

 ·

2021-03-20 09:30

往期热门文章:

1、往期精选优秀博文都在这里了!
2、分库分表?如何做到永不迁移数据和避免热点?
3、36 张图梳理 Intellij IDEA 常用设置,写代码贼爽!
4、2020年国内互联网公司的薪酬排名!
5不要再封装各种Util工具类了,这个神级框架值得拥有!

来源: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、历史文章分类导读列表!精选优秀博文都在这里了!》

2阿里一面:如何保障消息100%投递成功、消息幂等性?
3、GitHub 热榜:被网友疯狂恶搞的「蚂蚁呀嘿」项目终于开源了!
4、记住!看小电影前一定要检查一下域名是不是 HTTPS 的,不然....
5、拿到年终奖后马上辞职,厚道吗?
6、Redis 内存满了怎么办?
7、在 IDE 中玩转 GitHub
8、死磕18个Java8日期处理,工作必用!
9、把我坑惨的一个MySQL双引号!
10、2021年 我辞职了!

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报