• 公司这套架构统一处理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 exceptionHandler( Exception e) {
          log.error(e.getMessage(), e);
            return AjaxResult.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
           
        }
    
    }
    

    5 测试

    返回结果:

    总结:

    小编总结了2020面试题,这份面试题的包含的模块分为19个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 。

    关注我的公众号:程序员白楠楠,获取上述资料。

  • 相关阅读:
    一步一步学grails:7 MVC
    虚拟机安装CentOS7
    虚拟机安装windows sever2008
    微信console
    centOS7常用操作命令
    lr事务
    2.0通信之调用ADO.NET Data Services(数据服务)
    Silverlight应用程序中如何获取ASP.NET页面参数
    2.0网页之可脚本化, 与DOM的交互, 与JavaScript的交互
    2.0Tip/Trick之MessageBox, Popup, 循环的几种实现方法, 动态变换主题, 本地化(多语言), 响应鼠标双击事件
  • 原文地址:https://www.cnblogs.com/bainannan/p/14144445.html
Copyright © 2020-2023  润新知