什么是全局异常处理器?
就是把错误异常统一处理的方法。
应用场景:
1、如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异常处理器来捕捉该异常。
2、当你自定义了一个异常类,可以在全局异常处理器中来捕捉该异常。(当然也可以直接在抛出异常处直接捕获,但是这样需要在每一个抛出的地方都写一次捕获代码,看起来不够美观且复用性不强,其他异常同理)。
代码:
a.定义一个返回通用实体类
/**
* @author : S JY
* @description :
* @date : 2019/10/15 10:15
*/
public class ResultDto<T> {
private String msg;
private Integer code;
private T data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public ResultDto(String msg, Integer code, T data) {
this.msg = msg;
this.code = code;
this.data = data;
}
public ResultDto() {
}
}
b.自定义异常类
/**
* @author : S JY
* @description :
* @date : 2019/11/26 10:43
*/
public class MyException extends RuntimeException {
private String code;
private String msg;
private Object param;
public MyException(String code, String msg, Object param) {
this.code = code;
this.msg = msg;
this.param = param;
}
public MyException(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getParam() {
return param;
}
public void setParam(Object param) {
this.param = param;
}
}
c.写一个全局异常处理器
/**
* @author : S JY
* @description :
* @date : 2019/11/26 10:47
*/
@Slf4j
@ControllerAdvice //该注解定义全局异常处理类
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) //该注解声明异常处理方法
@ResponseBody
public Object handleException(HttpServletResponse response, Exception e) {
log.error(e.getMessage(), e);
if(e instanceof MyException) {
MyException ex = (MyException)e;
ResultDto<?> result = new ResultDto<>();
result.setMsg(ex.getMsg());
return result;
}else{
return new ResultDto<>("操作失败",null,null);
}
}
}
d.测试结果
@RequestMapping(value = "addUser")
public ResultDto addUser(User user) {
if (user.getName()==null){
throw new MyException("用户不能为空");
}
}