SpringBoot有两种处理异常的方式:
1.使用@ControllerAdvice和@ExceptionHandler处理全局异常
这种方式只能处理进入控制器的异常
2.使用@ErrorController类
这种方式可以处理全部异常,包括没进入控制器的异常。
下面主要记录一下第一种处理异常的方式:
要创建几个类:
1.公共返回对象
2.公共返回对象枚举
3.全局异常类
4.处理全局异常类
/**
* Description:公共返回对象
* Date: 2022/6/28 14:51
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseBean {
private long code;
private String message;
private Object obj;
/**
* 成功返回结果
* */
public static ResponseBean success(){
return new ResponseBean(ResponseBeanEnum.success.getCode(),ResponseBeanEnum.success.getMessage(),null);
}
/**
* 重载上面的方法
* */
public static ResponseBean success(Object obj){
return new ResponseBean(ResponseBeanEnum.success.getCode(),ResponseBeanEnum.success.getMessage(),obj);
}
/**
* 失败返回结果
* */
public static ResponseBean error(ResponseBeanEnum responseBeanEnum){
return new ResponseBean(responseBeanEnum.getCode(),responseBeanEnum.getMessage(),null);
}
/**
* 失败返回结果
* */
public static ResponseBean error(ResponseBeanEnum responseBeanEnum,Object obj){
return new ResponseBean(responseBeanEnum.getCode(),responseBeanEnum.getMessage(),obj);
}
}
/**
* Description:公共返回对象枚举
* Date: 2022/6/28 14:51
**/
@Getter
@AllArgsConstructor
@ToString
public enum ResponseBeanEnum {
// 通用
success(0,"SUCCESS"),
ERROR(500,"服务端异常"),
// 登录模块
LOGIN_ERROR(500210,"手机号或密码错误"),
PHONE_ERROR(500211,"手机号码格式不正确"),
LOGIN_IS_NOT_NULL(500212,"手机号或密码不能为空"),
BINDING_ERROR(500213,"参数校验异常")
;
private final Integer code;
private final String message;
}
/**
* Description:全局异常类
* Date: 2022/6/28 17:28
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GlobalException extends RuntimeException{
private ResponseBeanEnum responseBeanEnum;
}
/**
* Description:全局异常处理类
* Date: 2022/6/28 17:35
**/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseBean ExceptionHandler(Exception e){
if(e instanceof GlobalException){
GlobalException ex= (GlobalException) e;
return ResponseBean.error(ex.getResponseBeanEnum());
// 处理参数校验抛出的异常 BindException
}else if(e instanceof BindException){
BindException ex= (BindException) e;
ResponseBean res=ResponseBean.error(ResponseBeanEnum.BINDING_ERROR);
res.setMessage("参数校验异常:"+ex.getAllErrors().get(0).getDefaultMessage());
return res;
}
return ResponseBean.error(ResponseBeanEnum.ERROR);
}
}
5.使用
比如在service层验证用户是否存在
// 根据手机号验证用户是否存在
User user = userMapper.selectByPhone(mobile);
if(user==null){
throw new GlobalException(ResponseBeanEnum.LOGIN_ERROR);
}