SpringBoot如何制定自定义全局异常处理呢?
下文笔者讲述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("调用成功"); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。