实际我们在开发过程中可能需要做很多的判断校验,如果出现了非法情况我们是期望响应对应的提示
的。但是如果我们每次都自己手动去处理就会非常麻烦。我们可以选择直接抛出异常的方式,然后对异
常进行统一处理。把异常中的信息封装成 ResponseResult 响应给前端。
定义统一的异常类
我们需要定义服务中可能抛出的自定义异常类。这些异常类可以继承自RuntimeException
,并携带有关异常的相关信息。即可理解为局部异常,用于特定的业务处理中异常。手动埋点抛出。
public class ZhiWenPlusException extends RuntimeException { private String errMessage; public ZhiWenPlusException() { super(); } public ZhiWenPlusException(String errMessage) { super(errMessage); this.errMessage = errMessage; } public ZhiWenPlusException(AppHttpCodeEnum httpCodeEnum) { super(httpCodeEnum.getMsg()); this.errMessage = httpCodeEnum.getMsg(); } public String getErrMessage() { return errMessage; } public static void cast(CommonError commonError) { throw new ZhiWenPlusException(commonError.getErrMessage()); } public static void cast(String errMessage) { throw new ZhiWenPlusException(errMessage); } }
异常处理器
创建一个全局的异常处理器,使用@ControllerAdvice
或者 @RestControllerAdvice
注解和@ExceptionHandler
注解来捕获不同类型的异常,并定义处理逻辑。
@RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(SystemException.class) public ResponseResult systemExceptionHandler(SystemException e) { //打印异常信息 log.error("出现了异常! {}", e); //从异常对象中获取提示信息封装返回 return ResponseResult.errorResult(e.getCode(), e.getMsg()); } @ExceptionHandler(Exception.class) public ResponseResult exceptionHandler(Exception e) { //打印异常信息 log.error("出现了异常! {}", e); //从异常对象中获取提示信息封装返回 return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), e.getMessage()); } }
@ControllerAdvice注解
用于声明一个全局控制器建言(Advice),相当于把@ExceptionHandler
、@InitBinder
和@ModelAttribute
注解的方法集中到一个地方。常放在一个特定的类上,这个类被认为是全局异常处理器,可以跨足多个控制器。
当使用
@ControllerAdvice
时,我们需要在异常处理方法上加上@ResponseBody
,同理我们的web接口。但是如果我们使用@RestControllerAdvice
就可以不用加,同理也是web定义的接口
@ExceptionHandler
注解
用于定义异常处理方法,处理特定类型的异常。放在全局异常处理器类中的具体方法上。
通过这两个注解的配合,可以实现全局的异常处理。当控制器中抛出异常时,Spring Boot会自动调用匹配的@ExceptionHandler
方法来处理异常,并返回定义的响应。