公司这套架构统一处理try...catch真香!

描述

   

前言

 

软件开发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 测试

 代码

 返回结果:代码

 

审核编辑 :李倩


	

	

	

	

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分