我们想让异常结果也显示为统一的返回结果对象(可以看我的统一返回数据格式文章),并且统一处理系统的异常信息,那么需要统一异常处理。
创建统一异常处理器
/**
* 定义统一异常处理
*/
@ControllerAdvice
@Slf4j
public class HealthExceptionAdvice {
// 处理的所有的 Exception
@ExceptionHandler(Exception.class)
@ResponseBody
public Result error(Exception e){
e.printStackTrace();
return new Result<>(ResultEnum.ERROR);
}
/**
* 统一处理
*
*/
@ExceptionHandler(HealthException.class)
@ResponseBody
public Result<Object> exceptionHandler(HealthException exception) {
log.error("统一异常处理:"+exception.getMsg(), exception);
return new Result<>(exception.getCode(), exception.getMsg());
}
}
处理自定义异常
/**
* 自定义异常
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HealthException extends RuntimeException {
private static final long serialVersionUID = 2450214686001409867L;
private Integer code;
private String msg;
}
定义一些返回结果枚举配合使用
/**
* 返回结果枚举
*/
@Getter
public enum ResultEnum {
/**
* 返回结果枚举,每个枚举代表着一个返回状态
*/
SUCCESS(20000, "操作成功!"),
ERROR(40000, "操作失败!"),
DATA_NOT_FOUND(40001, "查询失败!"),
PARAMS_NULL(40002, "参数不能为空!"),
PARAMS_ERROR(40005, "参数不合法!"),
NOT_LOGIN(40003, "当前账号未登录!")
;
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
使用
if(StringUtils.isBlank(admin.getUsername())||StringUtils.isBlank(admin.getPassword())){
throw new HealthException(ResultEnum.PARAMS_NULL.getCode(), "用户名或密码不能为空!");
}