SpringBoot如何制定自定义全局异常处理呢?

戚薇 SpringBoot 发布时间:2023-07-07 15:02:13 阅读数:5017 1
下文笔者讲述SpringBoot设置自定义全局异常的方法及示例分享,如下所示

自定义全局异常处理的编写方法

一. 创建所需类
	1.自定义异常接口
	2.自定义枚举类
	3.自定义异常类
	4.自定义异常处理类
	5.自定义全局响应类
	  5.1 BaseResponse类
	  5.2 RespGenerator类
例:SpringBoot设置自定义全局异常类的示例

1.自定义异常接口

创建一个接口类出来,定义自定义接口所需要的方法
// 第一步:为了代码解耦,创建一个接口类出来,
//         定义自定义接口所需要的方法
// 抽象类,提供自定义异常所需的方法
public interface BaseErrorInfoInterface {
    String getCode();
    String getMessage();
}

2.自定义枚举类

定义一个枚举类,实现上述BaseErrorInfoInterface接口,
   重写上述接口的两个方法来操作这个枚举类内部的各个具体枚举值
 
//第二步:定义一个枚举类,实现上述接口,重写上述接口的两个方法来操作这个枚举类内部的各个具体枚举值
public enum BaseErrorEnum implements BaseErrorInfoInterface {

    //定义异常枚举
    SUCCESS("200","成功"),
    USER_NOT_EXIST("1001","用户不存在");

    // 错误码
    private String code;
    // 错误信息提示
    private String message;

    BaseErrorEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }
}
 
通过构造方法传入code值和message或直接传入一个枚举值都行

3.自定义异常类

自定义一个异常类
  就像空指针异常类、IO流异常类一样。
  此处自定义的异常类属于异常类,
  所有肯定是要继承一个异常类的
    此处需要继承RuntimeException
原因如下:
	RuntimeException相比Exception
	  他是在程序运行时才会爆出异常
	  在编译时是不会出现异常的
    如果你throw了一个RuntimeException
	   不需要做额外操作;
	  而throw一个Exception,
	  程序会要求你try-catch,
	  否则你根本启动不了程序,
	  程序会提示(必须对其进行捕获或声明以便抛出)
@Data
public class BaseException extends RuntimeException {

    // 错误码
    private String code;
    // 错误信息提示
    private String message;

    public BaseException(){
        super();
    }
    // 自定义异常构造方法
    public BaseException(BaseErrorEnum baseErrorEnum){
        super(baseErrorEnum.getCode());
        this.code=baseErrorEnum.getCode();
        this.message=baseErrorEnum.getMessage();
    }
}

4.自定义异常处理类

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    // 处理自定义异常
    @ExceptionHandler({BaseException.class})
    public BaseResponse<Object> baseExceptionHandler(BaseException e) {
        log.debug("请求错误:{}", e.getMessage());
        return RespGenerator.failure(e.getCode(), e.getMessage());
    }

    // 处理空指针异常
    @ExceptionHandler({NullPointerException.class})
    public BaseResponse<Object>  exceptionHandler(NullPointerException e) {
        log.error("运行时异常:{}", e.getMessage());
        return RespGenerator.failure(BaseErrorEnum.USER_NOT_EXIST);
    }

    // 处理其他异常
    @ExceptionHandler({Exception.class})
    public BaseResponse<Object>  exceptionHandler(Exception exception) {
        log.error("未知异常:{}", exception);
        return RespGenerator.failure("500", "系统未知异常");
    }
} 
注解说明
  @ControllerAdvice注解:
     结合方法型注解@ExceptionHandler
	  用于捕获Controller中抛出的指定类型的异常
	  从而达到不同类型的异常区别处理的目的。
  @ExceptionHandler注解:
     统一处理某一类异常
	  从而能够减少代码重复率和复杂度
	  value值为什么异常类型
	  就处理什么异常类型的逻辑。

5.自定义全局响应类

所有方法返回值类
   BaseResponse类和RespGenerator类
   都属于规范方法返回值结构体的类
   也有利于一致化后端所有接口的返回结构
    方便前端读取所需要的数据

5.1 BaseResponse类

规定返回值结构
@Data
public class BaseResponse<T> {

    private String code;

    private String messgae;

    private T Data;

    public BaseResponse() {
        super();
    }
    public BaseResponse(String code, String messgae, T data) {
        this.code = code;
        this.messgae = messgae;
        Data = data;
    }
} 

5.2 RespGenerator类

将逻辑处理后的数据包装转换成BaseResponse类进行返回给前端。
public class RespGenerator {

    // 正常返回时调用方法
    public static BaseResponse success(Object data){
        return new BaseResponse(BaseErrorEnum.SUCCESS.getCode(),"接口调用成功",data);
    }
    // 失败时调用方法
    public static  BaseResponse<Object> failure(BaseErrorEnum baseErrorEnum){
        return new BaseResponse(baseErrorEnum.getCode(),baseErrorEnum.getMessage(),null);
    }

    // 失败时调用方法(提供给GlobalExceptionHandler类使用)
    public static BaseResponse<Object> failure(String code,String message){
        return new BaseResponse(code,message,null);
    }

}
 

测试
//当name 不等于 java265 时
// 则 抛出指定异常

@RestController
public class ExceptionTest {

    @GetMapping("/test")
    public BaseResponse<String> test(@RequestParam("name") String name){
        if(!name.equals("java265")){
            throw new BaseException(BaseErrorEnum.USER_NOT_EXIST);
        }
        else{
            return RespGenerator.success("调用成功");
        }
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202307/7026.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者