实际我们在开发过程中可能需要做很多的判断校验,如果出现了非法情况我们是期望响应对应的提示
的。但是如果我们每次都自己手动去处理就会非常麻烦。我们可以选择直接抛出异常的方式,然后对异
常进行统一处理。把异常中的信息封装成
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
方法来处理异常,并返回定义的响应。