下面我将详细讲解Spring Boot处理全局统一异常的两种方法与区别。
1. 方法一:使用@ControllerAdvice注解
1.1 @ControllerAdvice注解的作用
@ControllerAdvice注解用于定义全局异常处理方法,可以在单个类中定义多个异常处理方法,且可以分不同的异常类进行处理。
1.2 具体实现步骤
-
创建一个全局异常处理类,使用@ControllerAdvice注解进行注解。
```
@ControllerAdvice
public class GlobalExceptionHandler {}
2. 在该类中定义方法,使用@ExceptionHandler注解捕获要处理的异常类型。
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result exceptionHandler(Exception e) {
if (e instanceof BusinessException) {
// 处理业务异常
} else if (e instanceof DataAccessException) {
// 处理数据库异常
}
// 其他异常
return Result.failure("系统异常");
}
```
这里以捕获Exception类为例,可以通过判断异常类型进行分类处理。
3. 在方法中返回一个结果对象,用于向调用者返回处理结果。
1.3 优缺点
优点
- 可以针对不同类型的异常进行分类处理;
- 处理异常的方法可以放置在统一的类中,便于维护和管理。
缺点
- 对于同一个异常类型,在不同的方法中可能需要编写相同或者相似的代码。
2. 方法二:使用@ControllerAdvice注解+自定义异常类
2.1 使用@ControllerAdvice注解的作用
同样是用于定义全局异常处理方法,与方法一不同的是,该方法将异常信息封装在自定义异常类中返回。
2.2 自定义异常类的作用
将异常信息进行封装,统一格式化异常信息,便于调用方处理异常。
2.3 具体实现步骤
-
创建一个自定义异常类。
```
public class GlobalException extends RuntimeException {
private static final long serialVersionUID = 1L;private int code; private String message; public GlobalException(int code, String message) { super(message); this.code = code; this.message = message; } // 省略getter和setter方法
}
2. 创建全局异常处理类,使用@ControllerAdvice注解进行注解。
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class) @ResponseBody public Result handle(Exception e) { if (e instanceof GlobalException) { GlobalException globalException = (GlobalException) e; return Result.failure(globalException.getCode(), globalException.getMessage()); } else { return Result.failure("系统异常"); } }
}
在方法中判断异常类型,如果是自定义异常类类型,就从中取出状态码和异常信息封装到返回对象中;如果是其他异常类型,就返回一个默认的异常信息。
3. 在程序中抛出自定义异常。
throw new GlobalException(50001, "用户名或密码错误");
```
在程序中可以像普通异常一样,通过throw语句来抛出自定义异常。
2.4 优缺点
优点
- 异常信息的返回格式统一;
- 对于同一个异常类型,只需要在自定义异常类中定义一次。
缺点
- 在处理异常之前需要定义自定义异常类;
- 增加了代码量。
以上就是Spring Boot处理全局统一异常的两种方法与区别的详细攻略,希望可以对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot处理全局统一异常的两种方法与区别 - Python技术站