前言:
通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度。
简单回顾:
第一阶段:统一响应的简单应用
第二阶段:统一响应的起源
第三阶段:统一响应实体的起源
第四阶段:统一响应实体的面向对象优化
分别对应的是
全局响应和异常响应的简单运用
前后端分离,为了提高开发效率而诞生的概念
基于后端响应的底层逻辑运用
为减少代码重复,提高代码可读写而诞生的工具类
正片:第五阶段:全局异常统一响应
第一步:封装一个专门用于异常的实体类
@Data @AllArgsConstructor public class BusinessException extends RuntimeException{/*** 异常状态码*/private int code;/*** 异常信息*/private String message;/*** 无参构造函数*/public BusinessException(){} }
继承RuntimeException完成异常实体的构建
第二步:实现全局异常
@Slf4j /*** 专门用于构建Result Api服务时的全局异常处理。* 这个注解允许开发者在一个集中的地方处理所有控制器层抛出的异常,* 并且能够统一错误响应格式,从而提高系统的健壮性和用户体验。*/ @RestControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(Throwable.class)public ApiResult handleException(Throwable e){log.info("系统异常:" + e);return ApiResultUnit.error(500,"系统问题,请联系管理员");} }
基础版全局异常
只有系统问题是不行滴
@Slf4j /*** 专门用于构建Result Api服务时的全局异常处理。* 这个注解允许开发者在一个集中的地方处理所有控制器层抛出的异常,* 并且能够统一错误响应格式,从而提高系统的健壮性和用户体验。*/ @RestControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(Throwable.class)public ApiResult handleException(Throwable e){/*** 当异常是自定义报错时*/if (e instanceof BusinessException){BusinessException businessException = new BusinessException();log.info("请求出现业务异常:", e);/*** 返回异常状态码、异常信息*/return ApiResultUnit.error(businessException.getCode(), businessException.getMessage());}log.info("系统异常:",e);return ApiResultUnit.error(500,"系统问题,请联系管理员");} }
问题又来了,我们没有自定义业务异常,所以无效
用一大段代码减少重复性的判断
@GetMapping("/findById")public ApiResult<UserEntity> findById(Long id) {UserEntity byId = userService.findById(id);if (byId != null) {return new ApiResult<>(200, "操作成功", byId);}return new ApiResult<>(430,"未查询用户",null);}