十四、全局异常处理器
全局异常处理器(Global Exception Handler)是指一种机制,用于集中处理应用程序中未被捕获的异常。全局异常处理器可以用来统一处理整个应用程序中可能出现的异常,从而确保在出现未预期的错误时,程序能够以一种优雅的方式处理这些错误,并提供一致的错误响应或记录。
1、 RestControllerAdvice 注解
@RestControllerAdvice
是 Spring Framework 中的一个注解,它用于创建全局异常处理类。这个注解是@ControllerAdvice
和@ResponseBody
的组合,专为 RESTful API 设计。当你在 Spring MVC 应用程序中使用
@RestControllerAdvice
注解时,它会创建一个控制器层的切面(AOP),可以用来集中处理控制器类中的异常或者错误。这使得你可以编写更加干净和模块化的代码,因为具体的控制器类不需要包含错误处理逻辑。
作用:
- 异常处理:可以定义方法来捕获特定类型的异常,并返回合适的 HTTP 响应状态码和/或响应体。
- 统一响应格式:可以用来确保所有的响应都符合一定的格式,比如 JSON 格式,并且包含特定的头部信息。
- 数据验证:可以用来处理数据绑定和验证错误,返回给客户端更友好的错误信息。
2、实现步骤
- 创建一个全局处理异常类,在类上加上注解
@RestControllerAdvice
- 创建一个要处理的异常类,继承RuntimeException类,在创建异常类中,写一个构造器,写上接收参数(
String message
),构造器里将参数传递给继承的父类super(message);
- 在全局处理异常类,创建要处理的异常方法,加上注解
@ExceptionHandler
,注解参数写刚刚创建的异常类的class对象(类名.class),方法的返回值就是返回给前端的Result类型,通过参数的方式将异常对象注入进来(类名 变量)。 - 通过注入的异常类对象,获取到填入的异常信息,并封装后返回给前端(
exception.getMessage()
) - 在需要处理异常的地方就调用自定义的异常来处理(通过构造器创建异常类,将异常信息传入)
3、代码实现
1、创建一个全局处理异常类,在类上加上注解
@RestControllerAdvice
@RestControllerAdvice
public class GlobalExceptionHandler {
}
2、创建一个要处理的异常类,继承RuntimeException类,在创建异常类中,写一个构造器,写上接收参数(
String message
),构造器里将参数传递给继承的父类super(message);
通常一类异常创建一个异常类
/**
* Jwt验证异常
*/
public class JwtVerificationException extends RuntimeException{
public JwtVerificationException(String message) {
super(message);
}
}
/**
* 登录失败异常
*/
public class LoginFailException extends RuntimeException{
public LoginFailException(String message) {
super(message);
}
}
3、在全局处理异常类,创建要处理的异常方法,加上注解
@ExceptionHandler
,注解参数写刚刚创建的异常类的class对象(类名.class),方法的返回值就是返回给前端的Result类型,通过参数的方式将异常对象注入进来(类名 变量)。 4、通过注入的异常类对象,获取到填入的异常信息,并封装后返回给前端(exception.getMessage()
)
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理自定义异常-JWT异常处理
* @param e
* @return
*/
@ExceptionHandler(JwtVerificationException.class)
public Result handleJwtVerificationException(JwtVerificationException exception){
return Result.error(exception.getMessage());
/**
* 登录失败
* @param exception
* @return
*/
@ExceptionHandler(LoginFailException.class)
public Result loginFailException(LoginFailException exception){
return Result.error(exception.getMessage());
}
/**
* 捕获全部异常(通常不这样做,通常是有什么异常就处理什么异常) 如下:
* @ExceptionHandler
* public Result ex(Exception exception){
* exception.printStackTrace();
* return Result.error("服务器异常");
* }
*/
}
5、在需要处理异常的地方抛出异常类(抛出通过构造器创建异常类对象,将异常信息传入)
// 判断JWT是否过期了 如果过期就可以抛出ExpiredJwtException异常
throw new JwtVerificationException("token已过期");
//判断用户是否为空,为空表示验证失败,返回错误信息
if (user == null){
throw new LoginFailException("登录失败");
}
后端统一返回结果 Result ,根据自己的习惯来定义
/**
* 后端统一返回结果
* @param <T>
*/
@Data
public class Result<T> implements Serializable {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
public static <T> Result<T> success() {
Result<T> result = new Result<T>();
result.code = 1;
return result;
}
public static <T> Result<T> success(T object) {
Result<T> result = new Result<T>();
result.data = object;
result.code = 1;
return result;
}
public static <T> Result<T> error(String msg) {
Result result = new Result();
result.msg = msg;
result.code = 0;
return result;
}
}
标签:result,exception,JavaWeb,合集,class,Result,异常,public,14
From: https://blog.csdn.net/qq_57340195/article/details/143211024