自定义异常
理想的情况:自定义异常使用过后,可以按照统一返回数据格式返回给前端,让前端来处理。
使用
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
@RestControllerAdvice
public class DemoExceptionHandler {
@ExceptionHandler(DemoException.class)
public DemoResult demoResultException(DemoException e){
return DemoResult.newInstance(CodeTypeEnum.ERROR,CodeEnum.LOGIN_FAILURE.code(),e.getMessage());
}
}