Spring Boot 2.X - Spring Boot全局异常处理
本文简单介绍一下Spring Boot的全局异常处理
原有的异常处理
使用IDEA创建一个Spring Boot项目,先定义一个Controller用于测试:
@RestController
public class TestController {
@GetMapping("/test")
public String test(Integer num) {
int result = 10 / num;
return "success-" + result;
}
}
测试接口异常:
打开浏览器访问 http://localhost:8080/test?num=0 :
或者是在REST API Testing
插件中测试:
上边暴露的异常信息并不是我们想要的,试想如果别人调用你的接口,甚至你调用别人的接口,返回这样的东西,估计要疯。
当然,我们可以采用try/catch
来捕获异常,在service里或者controller里,每个方法捕获,,,代码太过冗余且非常不易维护。
我们采用统一异常处理类去捕获异常并处理,无需controller捕获,并且向用户返回统一规范的响应信息。
全局异常处理
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
异常信息枚举
@Getter
@AllArgsConstructor
@NoArgsConstructor
public enum ExceptionEnum {
SUCCESS(true,10000,"操作成功!"),
ZERO_ERROR(false,10001,"除数不能为零!"),
INVALID_ARGS(false,10002,"缺少参数!"),
FAIL(false,99999,"系统异常"),
;
private boolean success;
private int code;
private String message;
}
自定义异常
自定义一个异常类,用于处理我们已知的特定异常
@Data
public class CustomException extends RuntimeException {
private static final long serialVersionUID = -4096086160269012865L;
private ExceptionEnum exceptionEnum;
public CustomException(ExceptionEnum exceptionEnum) {
super();
this.exceptionEnum = exceptionEnum;
}
}
返回结果类
定义一个结果类,用于统一展示我们返回的信息,包括异常信息
@Data
public class ResponseResult {
private boolean success;
private int code;
private String message;
public ResponseResult(ExceptionEnum exceptionEnum) {
this.success = exceptionEnum.isSuccess();
this.code = exceptionEnum.getCode();
this.message = exceptionEnum.getMessage();
}
public static ResponseResult fail(){
return new ResponseResult(ExceptionEnum.FAIL);
}
}
接口修改
修改web接口,对于已知的异常,抛出我们自定义的异常信息
@RestController
public class TestController {
@GetMapping("/test")
public String test(Integer num) {
if (num == null) {
throw new CustomException(ExceptionEnum.INVALID_ARGS);
}
if (num == 0) {
throw new CustomException(ExceptionEnum.ZERO_ERROR);
}
int result = 10 / num;
return "success-" + result;
}
}
异常处理器
使用@RestControllerAdvice
捕获Controller抛出的异常,@ExceptionHandler
统一处理指定的异常
@RestControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseResult customException(CustomException e) {
return new ResponseResult(e.getExceptionEnum());
}
@ExceptionHandler(RuntimeException.class)
public ResponseResult exception(RuntimeException e) {
return ResponseResult.fail();
}
}
测试接口
如此,我们就实现了简单的自定义全局异常处理。
原文地址:https://xudc.tech/2019/05/01/spring-boot-2-x-spring-boot-global-exception-handle/