自定义异常

理想的情况:自定义异常使用过后,可以按照统一返回数据格式返回给前端,让前端来处理。

使用

  1. throw new YshopException("用户为空");

返回

  1. {
  2. "type": "ERROR",
  3. "code": 401004,
  4. "codeMessage": "用户为空",
  5. "data": {}
  6. }

思路流程

  1. 要有一个统一接口返回的数据格式。
  2. 定义一个自定义异常继承RuntimeException
  3. 写一个自定义异常拦截器,来返回数据格式

统一的接口数据返回格式

这个可以自定义,也可以使用springboot自带的ResponseEntity<>
当然自定义的就一般包含了数据data,请求的返回值等等,我这自定义的叫做DemoResult

定义一个自定义的异常

这个统一处理异常包含了,常用的状态码code,但是因为这是异常的所以,一般是errorCode,这个可以是DemoResult的Code,还有就是错误信息message

  1. /**
  2. * 统一处理异常
  3. *
  4. * @Author: LoneyFeather
  5. * @Date: Created in 14:02 2021/11/12
  6. */
  7. @Data
  8. @EqualsAndHashCode(callSuper = true)
  9. public class DemoException extends RuntimeException{
  10. private static final long serialVersionUID = -2470461654663264392L;
  11. private Integer errorCode;
  12. private String message;
  13. public DemoException(){
  14. super();
  15. }
  16. public DemoException(String message) {
  17. super(message);
  18. this.message = message;
  19. }
  20. public DemoException(Integer errorCode, String message){
  21. super(message);
  22. this.errorCode = errorCode;
  23. this.message = message;
  24. }
  25. public DemoException(CodeEnum codeEnum){
  26. super(codeEnum.getMessage());
  27. this.errorCode = codeEnum.code();
  28. this.message = codeEnum.getMessage();
  29. }
  30. public DemoException(String message, Throwable cause) {
  31. super(message, cause);
  32. }
  33. public DemoException(Throwable cause) {
  34. super(cause);
  35. }
  36. }

到了这一部,已经可以使用这个,统一异常处理,但是他不会返回给接口之前理想的情况,只会报错500,然后就是重要的异常处理拦截器

自定义异常拦截器

  1. throw new YshopException("用户为空");
  2. throw new YshopException(CodeEnum.NOT_USER_ID.getMessage());

原理就是,拦截之后将里面的message信息加入到,统一接口的数据里面去。

  1. /**
  2. *自定义异常拦截器
  3. * 主要作用为,@RestControllerAdvice
  4. *
  5. * @Author: LoneyFeather
  6. * @Date: Created in 16:02 2021/11/12
  7. */
  8. @Slf4j
  9. @RestControllerAdvice
  10. public class DemoExceptionHandler {
  11. @ExceptionHandler(DemoException.class)
  12. public DemoResult demoResultException(DemoException e){
  13. return DemoResult.newInstance(CodeTypeEnum.ERROR,CodeEnum.LOGIN_FAILURE.code(),e.getMessage());
  14. }
  15. }