统一异常处理
在代码中,如果有异常抛出,或者程序正常结束返回执行结果,最终返回的结果格式都不统一,为了对返回结果进行统一,就有了统一异常处理。
1.返回结果的规范化,定义Result类
public class Result {
// 返回结果的code
private Integer Code;
// 返回的信息
private String message;
// 返回的结果
private Object data;
//get,set方法,不做赘述
2.避免代码的冗余,创建工具类统一返回Result
Result result = new Result();
result.setCode(0);
result.setMessage("成功");
result.setData(object);
但上面的写法,无论是成功还是失败都需要重新创建一个Result对象,然后进行setxxx操作,会造成代码的重复和冗余,此时,可以写一个共通类
public class ResultUtil {
// 返回成功
public static Result success(Object object){
Result result = new Result();
result.setCode(0);
result.setMessage("成功");
result.setData(object);
return result;
}
public static Result success(){
return success(null);
}
// 返回失败
public static Result error(Integer code ,String message){
Result result = new Result();
result.setCode(code);
result.setMessage(message);
return result;
}
}
这样在需要返回Result的地方直接调用工具类,传入相应参数即可。
3.自定义异常处理,拦截异常统一处理 ExceptionHandle
//异常处理
@ControllerAdvice // 作用:拦截异常并统一处理
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);
@ExceptionHandler(value=Exception.class) // 指定捕获的是哪个异常
@ResponseBody
public Result Handle(Exception e){
if(e instanceof PrivateException){
PrivateException exception = (PrivateException) e;
return ResultUtil.error(exception.getCode(), exception.getMessage());
}else{
logger.error("系统异常,{}",e);
return ResultUtil.error(-1, "未知错误");
}
}
}
4.自定义异常
//自己定义一个Exception,必须继承自RuntimeException
public class PrivateException extends RuntimeException{
//错误码
private Integer code;
public PrivateException(ResultEnums resultEnums){
super(resultEnums.getMessage());
this.code = resultEnums.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
5.为了错误码code和错误信息message的统一,创建枚举统一管理
public enum ResultEnums {
UNKNOW_ERROR(-1,"未知错误"),
SUCCESS(0,"成功"),
PRIMARY_SCHOOL(100,"上小学"),
MIDDLE_SCHOOL(101,"上初中")
;
private Integer code;
private String message;
ResultEnums(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
总结流程:
场景:如果需要判断一个年纪,<10返回message是“上小学”,>10并且<16返回message是“上初中”,其他情况就做额外处理
这时候可以使用自定义异常,避免繁琐的if else
public void getAge(Integer age) throws Exception {
if(age<10){
// 上小学 抛出一个自定义异常
throw new PrivateException(ResultEnums.PRIMARY_SCHOOL);
}else if(age>10 && age<16){
// 上初中
throw new PrivateException(ResultEnums.MIDDLE_SCHOOL);
}
//其他额外操作
}
抛出异常之后,上面的异常拦截器ExceptionHandle 就会拦截异常进行处理,返回错误信息。