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;
    }

}

 

posted @ 2022-12-29 10:43  鼠标的博客  阅读(167)  评论(0编辑  收藏  举报