【springboot】全局异常处理

转自:

  https://blog.csdn.net/cp026la/article/details/86495196

前言:

开发中异常的处理必不可少,常用的就是 throw 和 try catch,这样一个项目到最后会出现很多冗余的代码,使用全局异常处理避免过多冗余代码。

全局异常处理:

1、pom 依赖(延续上一章代码):


    
    
    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        1.3.2
    
    
    
        mysql
        mysql-connector-java
        runtime
    
    
    
        com.alibaba
        druid-spring-boot-starter
        1.1.0
    
    
    
        org.projectlombok
        lombok
        1.16.18
    
    
    
        com.alibaba
        fastjson
        1.2.31
    
  


2、公共的结果类封装:
这里简单封装,实际根据自己业务需求去封装。

@Getter
@Setter
public class ApiResult {
    // 响应业务状态
    private Integer status;
    // 响应消息
    private String msg;
    // 响应中的数据
    private Object data;
    public static ApiResult build(Integer status, String msg, Object data) {
        return new ApiResult(status, msg, data);
    }
    public static ApiResult ok(Object data) {
        return new ApiResult(data);
    }
    public static ApiResult ok() {
        return new ApiResult(null);
    }
    public ApiResult() { }
    public static ApiResult build(Integer status, String msg) {
        return new ApiResult(status, msg, null);
    }
    public ApiResult(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }
    public ApiResult(Object data) {
        this.status = 200;
        this.msg = "OK";
        this.data = data;
    }
}

  

3、添加全局异常处理类(在入口函数下的包中新建):

/**
 * 全局异常处理 Handler
 * @ControllerAdvice  配置控制器通知
 * annotations 属性: 指定我们需要拦截的注解,一个或多个(多个加到大括号中,逗号分隔)
 */
// @RestControllerAdvice = @ResponseBody + @ControllerAdvice
@RestControllerAdvice(annotations = {RestController.class})
@Slf4j
public class GlobalExceptionHandler {
   /**
    * 默认统一异常处理方法
    * @ExceptionHandler 注解用来配置需要拦截的异常类型, 也可以是自定义异常
    */
   @ExceptionHandler(Exception.class)
   // 此处可以指定返回的状态码 和 返回 结果说明
   // @ResponseStatus(reason = "exception",value = HttpStatus.BAD_REQUEST)
   public Object runtimeExceptionHandler(Exception e) {
       // 打印异常信息到控制台
       e.printStackTrace();
       log.error("请求出现异常,异常信息为: {}", e.getMessage());
       // 使用公共的结果类封装返回结果, 这里我指定状态码为 400
       return ApiResult.build(400, e.getMessage());
   }
}  


4、异常测试类:

/**
 * 异常处理测试 controller
 */
@RestController
@Slf4j
public class ExceptionController {
     @RequestMapping(value = "/exception/{number}")
     public ApiResult exception(@PathVariable int number) {
        int res = 10 / number;
        log.info(">>>>>结果number为: {}", res);
        return ApiResult.ok();
    }
}  


5、测试:
  5.1、请求接口:http://localhost:8080/exception/1 结果正常
  5.2、请求接口:http://localhost:8080/exception/0 出现除以 0 错误,全局异常处理起作用,返回指定结果集。

你可能感兴趣的:(【springboot】全局异常处理)