springboot(十三)全局异常处理

x33g5p2x  于2021-12-17 转载在 其他  
字(3.1k)|赞(0)|评价(0)|浏览(602)

前言:

      不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。所以我们需要一个全局异常类。自定义我们的异常信息。

实现:

新建项目:springboot-exception,pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. <version>1.16.22</version>
  15. </dependency>
  16. </dependencies>

自定义提示码类:CodeMsg.java

  1. @Data
  2. public class CodeMsg {
  3. private int code;
  4. private String msg;
  5. //错码定义误
  6. public static CodeMsg SUCCESS = new CodeMsg(0, "success");
  7. public static CodeMsg SERVER_ERROR = new CodeMsg(50000, "服务端异常");
  8. public static CodeMsg BIND_ERROR = new CodeMsg(50001, "参数校验异常:%s");
  9. public static CodeMsg REQUEST_ILLEGAL = new CodeMsg(50002, "请求非法");
  10. private CodeMsg( int code,String msg ) {
  11. this.code = code;
  12. this.msg = msg;
  13. }
  14. public CodeMsg fillArgs(Object... args) {
  15. int code = this.code;
  16. String message = String.format(this.msg, args);
  17. return new CodeMsg(code, message);
  18. }
  19. }

自定义返回格式类:Result.java

  1. @Data
  2. public class Result<T> {
  3. //提示码
  4. private int code;
  5. //消息
  6. private String msg;
  7. //返回提示
  8. private T data;
  9. /**
  10. * 成功时候的调用
  11. * */
  12. public static <T> Result<T> success(T data){
  13. return new Result<T>(data);
  14. }
  15. /**
  16. * 失败时候的调用
  17. * */
  18. public static <T> Result<T> error(CodeMsg codeMsg){
  19. return new Result<T>(codeMsg);
  20. }
  21. private Result(T data) {
  22. this.data = data;
  23. }
  24. private Result(int code, String msg) {
  25. this.code = code;
  26. this.msg = msg;
  27. }
  28. private Result(CodeMsg codeMsg) {
  29. if(codeMsg != null) {
  30. this.code = codeMsg.getCode();
  31. this.msg = codeMsg.getMsg();
  32. }
  33. }
  34. }

自定义异常类:GlobalException.java。你可以自定义普通的Exception,也可以自定义RuntimeException

  1. public class GlobalException extends RuntimeException{
  2. private static final long serialVersionUID = 1L;
  3. private CodeMsg cm;
  4. public GlobalException(CodeMsg cm) {
  5. super(cm.toString());
  6. this.cm = cm;
  7. }
  8. public CodeMsg getCm() {
  9. return cm;
  10. }
  11. }

统一异常处理类:GlobalExceptionHandler.java

  1. @ControllerAdvice
  2. @ResponseBody
  3. public class GlobalExceptionHandler {
  4. @ExceptionHandler(value = Exception.class)
  5. public Result exceptionHandler(HttpServletRequest request, Exception e) {
  6. e.printStackTrace();
  7. //判断是否为自定义异常
  8. if (e instanceof GlobalException) {
  9. GlobalException ex = (GlobalException) e;
  10. return Result.error(ex.getCm());
  11. } else if (e instanceof BindException) {
  12. BindException ex = (BindException) e;
  13. List<ObjectError> errors = ex.getAllErrors();
  14. ObjectError error = errors.get(0);
  15. String msg = error.getDefaultMessage();
  16. return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
  17. } else {
  18. return Result.error(CodeMsg.SERVER_ERROR);
  19. }
  20. }
  21. }

     注:@ControllerAdvice 注解定义全局异常处理类
              @ExceptionHandler 指定自定义错误处理方法拦截的异常类型

            在if判断中我们可以自己定义需要捕获的异常种类,你可以自定定义多个异常类在这里来抛出

测试接口:TestCotroller.java

  1. @RestController
  2. public class TestController {
  3. @GetMapping("/index")
  4. public Result index(String name) {
  5. if(StringUtils.isEmpty(name)){
  6. //抛出自定义异常 CodeMsg为自定义的异常码
  7. throw new GlobalException(CodeMsg.BIND_ERROR.fillArgs(name));
  8. }
  9. return Result.success(name);
  10. }
  11. }

源码地址: https://gitee.com/xu0123/springboot2

相关文章