Spring-Boot中的统一异常处理

spring-boot中可以通过使用ControllerAdvice或RestControllerAdvice注解结合ExceptionHandler注解实现统一异常处理,由于spring-boot启动时会自动扫描并注入,因此使用起来非常方便,下面介绍基本的实现方式

1. 新建统一异常处理类

其实统一异常处理本质上是采用ControllerAdvice注解定义一个切面,通过类似Controller的方式来返回异常结果。首先我们可以新建一个处理类CommonExceptionHandler。

CommonExceptionHandler.java

//在类上使用RestControllerAdvice注解,表示返回的是一个body,可以把这个类看作一个controller
//这里也可以使用ControllerAdvice注解,这时需要在下面的方法中添加ResponseBody的注解
@RestControllerAdvice
@Slf4j
public class CommonExceptionHandler {
}

2. 配置具体的异常处理方法

之后我们可以在这个类中使用ExceptionHandler注解配置异常处理,类似与controller中的action,当系统抛出特定异常时,这里的方法会按照配置执行。

CommonExceptionHandler.java

@RestControllerAdvice
@Slf4j
public class CommonExceptionHandler {

    //注解中的value可以指定捕获的异常类型,可以支持多个异常
    @ExceptionHandler(value = {AuthException.class, AuthenticationException.class})  //缺少权限
    public Result handle(AuthException e) {
        log.error(e.getMessage());//输出日志
        return ResultUtil.error(401, e.getMessage());//返回结果
    }
    
    @ExceptionHandler(value = Exception.class)  //内部错误
    public Result handle(Exception e) {
        log.error(e.getMessage());
        return ResultUtil.error(500, e.getMessage());
    }
}
}

这里我采用了自定义的返回类型Result,可以根据自己的需求修改。

3. controller抛出异常

由于ControllerAdvice是从controller层捕获到异常,因此需要确保controller能抛出异常,这样才能使得异常被正确处理。

TestController.java

@RequestMapping(value = "/test", method = RequestMethod.GET)
public String Test() throws Exception {//需要抛出异常
    logger.error("Test log");
    throw new Exception("Test log");
}

最后的输出结果:

{
    "ErrorCode": 500,
    "ErrorMessage": "Test log",
    "Data": null,
    "IsSuccess": false
}

你可能感兴趣的:(Spring-Boot中的统一异常处理)