SpringBoot统一异常处理及自定义异常类

统一异常处理相关注解

  • @ControllerAdvice: 声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为 RESTFull 风格的数据,需要在声明 @ExceptionHandler 注解的方法上同时加上 @ResponseBody
  • @RestControllerAdvice: 声明在类上用于指定该类为控制增强器类。并声明返回的结果为 RESTFull 风格的数据,无需在声明 @ExceptionHandler 注解的方法上加 @ResponseBody
  • @ExceptionHandler: 声明在方法上用于指定需要统一拦截的异常。例如:@ExceptionHandler(value = Exception.class)

Controller 层的全局异常统一处理

@ControllerAdvice
public class MyControllerAdvice {
    
    
 
    // 全局异常捕捉处理
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception ex) {
    
    
        Map map = new HashMap();
        map.put("code", 100);
        map.put("msg", ex.getMessage());
        return map;
    }
    
    // 拦截捕捉自定义异常 MyException.class
    @ResponseBody
    @ExceptionHandler(value = MyException.class)
    public Map myErrorHandler(MyException ex) {
    
    
        Map map = new HashMap();
        map.put("code", ex.getCode());
        map.put("msg", ex.getMsg());
        return map;
    }
}

基于 @ControllerAdvice 注解的全局异常统一处理只能针对于 Controller 层的异常,意思是只能捕获到 Controller 层的异常,在 service 层或其他层面的异常是不能捕获的。有的时候,我们需要业务逻辑时抛出自定义异常,这个时候需要自定义业务异常类

自定义异常类捕捉 service 层或其他层面的异常

自定义异常类

public class BusinessException extends RuntimeException {
    
    

    private Integer code;

    public Integer getCode() {
    
    
        return code;
    }
    
    public void setCode(Integer code) {
    
    
        this.code = code;
    }
    
    public BusinessException(Integer code,String message) {
    
    
        super(message);
        this.code = code;
    }
}

消息类

public class ReturnMessage<T> {
    
    

    private Integer code;//错误码
    
    private String message;//提示信息
    
    private T data;//返回具体内容
    
    public ReturnMessage(Integer code, String message, T data) {
    
    
        super();
        this.code = code;
        this.message = message;
        this.data= data;
    }
    
    // 省略get and set方法
}

消息类处理工具类

public class ReturnMessageUtil {
    
    

    // 无异常 请求成功并有具体内容返回
    public static ReturnMessage<Object> sucess(Object object) {
    
    
        ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
        return message;
    }
    
    // 无异常 请求成功并无具体内容返回
    public static ReturnMessage<Object> sucess() {
    
    
        ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
        return message;
    }
    
    // 自定义错误异常信息
    public static ReturnMessage<Object> error(Integer code,String msg) {
    
    
        ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
        return message;
    }
}

统一异常拦截类

@RestControllerAdvice
public class ExceptionHandle {
    
    

    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);

    @ExceptionHandler(value = Exception.class)
    public ReturnMessage<Object> handle(Exception exception) {
    
    
        if(exception instanceof BusinessException) {
    
    
            BusinessException businessException = (BusinessException)exception;
            return ReturnMessageUtil.error(businessException.getCode(), businessException.getMessage());
        }else {
    
    
            logger.error("系统异常 {}",exception);
            return ReturnMessageUtil.error(-1, "未知异常"+ exception.getMessage());
        }
    }
}

service 层或其他层面抛异常

throw new BusinessException(100, "这个是自定义异常!")

此时,service 层或其他层面的异常就可以捕捉到了,返回给客户端 JSON 类型的异常数据

猜你喜欢

转载自blog.csdn.net/weixin_38192427/article/details/115175304