前言:
在编写项目的过程中,我们会在控制台得到特殊异常,这些异常需要做捕获并做一些特殊的处理响应给前端。为了更好的区分和管理异常,需要做全局异常管理。
本片文章针对接着上一篇的自定义注解(https://blog.csdn.net/shouji6175/article/details/126701595?spm=1001.2014.3001.5502)所产生的异常,进行进一步的处理。
import com.xxxx.seckill.vo.RespBeanEnum;
/**
* <p>
* 全局异常
* </p>
* 想要让自己的,全局异常生效就需要继承RuntimeException
* @since 2022-08-01
*/
public class GlobalException extends RuntimeException {
//这是我创建的公共返回对象枚举
private RespBeanEnum respBeanEnum;
public RespBeanEnum getRespBeanEnum() {
return respBeanEnum;
}
public void setRespBeanEnum(RespBeanEnum respBeanEnum) {
this.respBeanEnum = respBeanEnum;
}
public GlobalException(RespBeanEnum respBeanEnum) {
this.respBeanEnum = respBeanEnum;
}
}
2、创建全局异常处理,在前面发现控制台爆出的是 @BindException
所以这里针对 @BindException所爆出的异常进行特殊处理。
import com.xxxx.seckill.vo.RespBean;
import com.xxxx.seckill.vo.RespBeanEnum;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
//在这里利用@ExceptionHandler自定义异常处理的业务(约定大于默认)
@ExceptionHandler(Exception.class)
public RespBean ExceptionHandler(Exception e) {
if (e instanceof GlobalException) {
GlobalException exception = (GlobalException) e;
//正常的抛出异常
return RespBean.error(exception.getRespBeanEnum());
} else if (e instanceof BindException) {
//特殊异常处理,此处抛出的是 validation 中产生的运行时的异常
BindException bindException = (BindException) e;
RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);
//获取之前异常信息并保留下来,可封装成统一的返回对象给前端展示。
respBean.setMessage("参数校验异常:" + bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return respBean;
}
System.out.println("异常信息" + e);
return RespBean.error(RespBeanEnum.ERROR);
}
}