自定义异常
理想的情况:自定义异常使用过后,可以按照统一返回数据格式返回给前端,让前端来处理。
使用
throw new YshopException("用户为空");
返回
{"type": "ERROR","code": 401004,"codeMessage": "用户为空","data": {}}
思路流程
- 要有一个统一接口返回的数据格式。
- 定义一个自定义异常继承RuntimeException类
- 写一个自定义异常拦截器,来返回数据格式
统一的接口数据返回格式
这个可以自定义,也可以使用springboot自带的ResponseEntity<>;
当然自定义的就一般包含了数据data,请求的返回值等等,我这自定义的叫做DemoResult
定义一个自定义的异常
这个统一处理异常包含了,常用的状态码code,但是因为这是异常的所以,一般是errorCode,这个可以是DemoResult的Code,还有就是错误信息message
/*** 统一处理异常** @Author: LoneyFeather* @Date: Created in 14:02 2021/11/12*/@Data@EqualsAndHashCode(callSuper = true)public class DemoException extends RuntimeException{private static final long serialVersionUID = -2470461654663264392L;private Integer errorCode;private String message;public DemoException(){super();}public DemoException(String message) {super(message);this.message = message;}public DemoException(Integer errorCode, String message){super(message);this.errorCode = errorCode;this.message = message;}public DemoException(CodeEnum codeEnum){super(codeEnum.getMessage());this.errorCode = codeEnum.code();this.message = codeEnum.getMessage();}public DemoException(String message, Throwable cause) {super(message, cause);}public DemoException(Throwable cause) {super(cause);}}
到了这一部,已经可以使用这个,统一异常处理,但是他不会返回给接口之前理想的情况,只会报错500,然后就是重要的异常处理拦截器
自定义异常拦截器
throw new YshopException("用户为空");throw new YshopException(CodeEnum.NOT_USER_ID.getMessage());
原理就是,拦截之后将里面的message信息加入到,统一接口的数据里面去。
/***自定义异常拦截器* 主要作用为,@RestControllerAdvice** @Author: LoneyFeather* @Date: Created in 16:02 2021/11/12*/@Slf4j@RestControllerAdvicepublic class DemoExceptionHandler {@ExceptionHandler(DemoException.class)public DemoResult demoResultException(DemoException e){return DemoResult.newInstance(CodeTypeEnum.ERROR,CodeEnum.LOGIN_FAILURE.code(),e.getMessage());}}
