SpringBoot项目规范(1)| 异常统一处理以及自定义异常处理

你的名字 2023-10-03 20:13 75阅读 0赞

SpringBoot项目规范(1)| 异常统一处理以及自定义异常处理


文章目录 SpringBoot项目规范(1)| 异常统一处理以及自定义异常处理 @[TOC] 前言 一、自定义异常 1.自定义异常(ExploException) 2.定义错误码(HttpCode) 3.全局异常捕获 4.业务层异常处理 二、效果演示 1.请求失败返回结果 2.请求成功返回结果 总结

前言

在业务层代码中,当方法层层嵌套,对最深处的代码进行不满足的数据或者调价做判断时,直接返回响应体并不是很合适(这个时候就需要抛出自定义异常)

一、自定义异常

1.自定义异常(ExploException)

按照异常类型,自定义RuntimeException类型的异常,主要用于在业务处理过程中判断参数、响应、逻辑等是否满足条件,当不满足的时候直接抛出异常,并将异常原因放回前端提示。自定义异常代码如下

  1. import com.oak.monitor.response.HttpCode;
  2. import lombok.Data;
  3. @Data
  4. public class ExploException extends RuntimeException {
  5. /**
  6. * 错误码
  7. */
  8. private HttpCode retCode = HttpCode.UNKNOWN_ERROR;
  9. /**
  10. * 错误详情
  11. */
  12. private String errorInfo;
  13. public ExploException(String errorInfo) {
  14. super(errorInfo);
  15. }
  16. public ExploException(HttpCode retCode) {
  17. this.retCode = retCode;
  18. this.errorInfo = errorInfo;
  19. }
  20. public ExploException(HttpCode retCode, String errorInfo) {
  21. super(errorInfo);
  22. this.retCode = retCode;
  23. this.errorInfo = errorInfo;
  24. }
  25. }

2.定义错误码(HttpCode)

错误码定义分不同的类别,这样的好处是便于管理,并且如果有国际化需求可以很快的切换

  1. public enum HttpCode {
  2. // 成功状态码
  3. SUCCESS(00000, "成功"),
  4. UNKNOWN_ERROR(99999, "服务未知异常"),
  5. // 系统500错误
  6. UNAUTHORIZED(10401, "签名验证失败"),
  7. // 参数错误:10001-19999
  8. PARAM_IS_INVALID(10001, "参数无效"),
  9. // 用户错误:20001-29999
  10. USER_NOAUTH(20000,"用户未登录"),
  11. USER_HAS_EXISTED(20001, "用户名已存在"),
  12. USER_NOT_FIND(20002, "用户名不存在"),
  13. USER_PASS_ERROR(20003,"密码不正确"),
  14. USER_LOCKED(20004,"账户已锁定"),
  15. USER_PASS_OUT(20005,"用户名或密码错误次数过多"),
  16. USER_NOTFIND_ERROR(20006,"没有找到用户"),
  17. USER_ERROR(20007,"用户名或密码不正确"),
  18. // ES错误:30001-39999
  19. ES_INDEX_ERROR(30001,"索引已经存在");
  20. private Integer code;
  21. private String message;
  22. HttpCode(Integer code, String message) {
  23. this.code = code;
  24. this.message = message;
  25. }
  26. public Integer code() {
  27. return this.code;
  28. }
  29. public String message() {
  30. return this.message;
  31. }
  32. }

3.全局异常捕获

用于捕获代码层抛出的异常,对捕获的异常进行个性化逻辑处理。

  1. @ControllerAdvice
  2. public class GlobalExceptionHandle {
  3. private final Logger logger = LoggerFactory.getLogger(getClass());
  4. @ResponseStatus(value = HttpStatus.OK)
  5. @ExceptionHandler(ExploException.class)
  6. @ResponseBody
  7. public ResponseHandle handleException(ExploException e) {
  8. ResponseHandle response = new ResponseHandle();
  9. response.setDesc(e.getMessage());
  10. response.setStatus(e.getRetCode().code());
  11. return response;
  12. }
  13. @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) // 此处是为了设置http的响应码
  14. @ExceptionHandler(ArithmeticException.class)
  15. @ResponseBody
  16. public ResponseHandle handleException(ArithmeticException e) {
  17. ResponseHandle response = new ResponseHandle();
  18. response.setDesc(e.getMessage());
  19. response.setStatus(HttpCode.SYSTEM_ERROR.code());
  20. return response;
  21. }
  22. }

说明:
@ResponseStatus(value = HttpStatus.OK)这个定义了捕获的异常返回前端的http请求状态
@ExceptionHandler(ExploException.class) 这个定义捕获的异常类型

4.业务层异常处理

业务层对于不满足条件的逻辑进行异常抛出

  1. if (StringUtils.equals("小明", employe.getName())) {
  2. throw new ExploException(HttpCode.EUSER_ERROR);
  3. }else{
  4. return ResponseHandle.SUCCESS(employe);
  5. }

二、效果演示

1.请求失败返回结果

业务抛出异常结果,http的响应码是200,业务抛出的状态码是status:30002,这样客户端拿到改状态码就可以进行提示
在这里插入图片描述

2.请求成功返回结果

成功返回状态码为status:0

955989f7de8444db90e2411c794414b5.png

总结

以上就是SpringBoot规范化异常处理,这样异常情况下返回给客户端的格式将会统一,便于前端业务逻辑的判断。

发表评论

表情:
评论列表 (有 0 条评论,75人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Springboot定义异常处理

    背景 Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自定义异常的处理,参看以下