java 异常类,返回对象设计
1、进行业务编码之前设计好自定义异常,错误码,出现异常时对用户和调用者一定要友好
2、约定好方法的返回值,空对象,空集合还是null,视情况而定
3、防止空指针NPE。
几种可能出现空指针的情况:
(1)数据库查询结构可能为空,选好了持久层框架后统一一下未查询到数据时的返回结果
(2)集合中取出的元素为null
(3)调用接口返回对象时,一律要进行空指针判断
(4)连续调用Obj.getA().getB().getC()
4、返回类型的定义和格式要统一设计好,现在一般是调用接口返回json格式,前端解析
5、关键位置的操作一定要加日志。日志使用占位符,不要用String拼接
给出一种返回类型Result的参考:
@Data
public class Result {
private String code;
private String msg;
private Object data = null;
public Result() {
}
/**
* 这个方法返回本身,因此可以实现链式调用
*
* @param msg 封装的消息
* @return 完成封装后的结果对象
*/
public Result msg(String msg) {
this.msg = msg;
return this;
}
/**
* 这个方法返回本身,因此可以实现链式调用
*
* @param results 封装的内容
* @return 完成封装后的结果对象
*/
public Result data(Object results) {
this.data = results;
return this;
}
/**
* 获取一个包含成功状态码的结果对象。
* 此结果对象中还未封装任何其他信息,需要调用 {@link Result#msg(String)} 方法,
* 或者 {@link Result#data(Object)} 方法进行进一步的封装。
*
* @return 一个包含正确状态码的结果对象。
*/
public static Result success() {
Result result = new Result();
result.setCode(ErrorCode.SUCCESS.getCode());
return result;
}
/**
* 获取一个包含未知异常的结果对象。
* 此结果对象中还未封装任何其他信息,需要调用 {@link Result#msg(String)} 方法,
* 或者 {@link Result#data(Object)} 方法进行进一步的封装。
*
* @return 一个包含未知异常的结果对象。
*/
public static Result error() {
return error(ErrorCode.ERR_UNKNOWN_EXCEPTION);
}
/**
* 根据传入的 {@code CommonException} 对象,创建一个特定错误的结果对象。
*
* @param exception 一个错误对象
* @return 一个包含特定错误状态码和提示的结果对象。
*/
public static Result error(CommonException exception) {
Result result = new Result();
result.setCode(exception.getCode());
result.setMsg(exception.getMsg());
return result;
}
/**
* 根据传入的 {@code ErrorCodeEnum} 对象,创建一个特定错误的结果对象。
*
* @param errorCodeEnum 一个错误码枚举类型的对象
* @return 一个包含特定错误状态码和中文提示的结果对象。
*/
public static Result error(ErrorCode errorCodeEnum) {
return errorWithPrefix(errorCodeEnum, false);
}
/**
* 根据传入的 {@code ErrorCodeEnum} 对象,创建一个特定错误的结果对象。
*
* @param errorCodeEnum 一个错误码枚举类型的对象
* @param withPrefix 错误码是否要添加固定的前缀
* @return 一个包含特定错误状态码和中文提示的结果对象。
*/
private static Result errorWithPrefix(ErrorCode errorCodeEnum, boolean withPrefix) {
Result result = new Result();
result.setCode((withPrefix ? Constants.ERROR_CODE_PREFIX : "") + errorCodeEnum.getCode());
result.setMsg(errorCodeEnum.getMsgCN());
return result;
}
/**
* 根据传入的 {@code ErrorCodeEnum} 对象,创建一个特定错误的结果对象。
*
* @param errorCodeEnum 一个错误码枚举类型的对象
* @return 一个包含特定错误状态码和英文提示的结果对象。
*/
public static Result errorEN(ErrorCode errorCodeEnum) {
Result result = new Result();
result.setCode(Constants.ERROR_CODE_PREFIX + errorCodeEnum.getCode());
result.setMsg(errorCodeEnum.getMsgEN());
return result;
}
}
给出一种异常类设计的参考:
/**
* 自定义的一个运行时异常。
*/
public class CommonException extends RuntimeException {
private final String code;
private final String msg;
public CommonException(String msg) {
super(msg);
this.code = ErrorCode.ERR_BUSINESS_EXCEPTION.getCode();
this.msg = msg;
}
public CommonException(ErrorCode errorCodeEnum) {
super(errorCodeEnum.getMsgCN());
this.code = errorCodeEnum.getCode();
this.msg = errorCodeEnum.getMsgCN();
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
}