自定义异常与抛出

自定义异常与抛出

在 Java 中,异常处理是一个重要的概念,用于处理程序运行时可能发生的错误情况。

在项目中可以创建自定义异常类,继承 Exception 或 RuntimeException,用于表示特定的业务异常情况。

1.自定义异常CrmebException

public class CrmebException extends RuntimeException {

    private static final long serialVersionUID = 6397082987802748517L;

    /**
     * 错误码
     */
    private Integer code;

    /**
     * 错误信息
     */
    private String message;

    public CrmebException() {
        super();
    }

    public CrmebException(String message) {
        super(CommonResultCode.ERROR.getCode() + "-" + message);
        this.code = CommonResultCode.ERROR.getCode();
        this.message = message;
    }

    public CrmebException(IResultEnum iResultEnum) {
        super(iResultEnum.getCode() + "-" + iResultEnum.getMessage());
        this.code = iResultEnum.getCode();
        this.message = iResultEnum.getMessage();
    }

    public CrmebException(IResultEnum iResultEnum, String message) {
        super(iResultEnum.getCode() + "-" + message);
        this.code = iResultEnum.getCode();
        this.message = message;
    }

    public CrmebException(IResultEnum iResultEnum, Throwable throwable) {
        super(iResultEnum.getCode() + "-" + iResultEnum.getMessage() + ", " + throwable.getMessage(), throwable);
        this.code = iResultEnum.getCode();
        this.message = iResultEnum.getMessage();
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

自定义异常类主要有两个属性,code标识错误码,message具体描述异常信息。

2.错误码接口 ErrCode

在特定业务中,前端可以通过接口返回的不同错误码,进行不同的业务处理,比如有的接口需要用户登录方可访问,可以通过返回特定的错误码,由前端引导用户进行登录。

public interface IResultEnum {

    /**
     * 响应码规则:各个模块固定4位返回码
     * 1***:登录、注册、认证模块
     * 2***:支付、提现相关
     * 3***:管理员模块
     * 4***: 商户模块
     * 5***: 订单模块
     * 6***: 商品模块
     * 7***: 系统设置模块
     * 8***: 用户模块
     * 9***:社区模块
     * 10***: 优惠券模块
     * 11***: 营销模块
     * 12***: 一号通模块
     * 13***: 微信模块
     * 14***: 会员模块
     */

    Integer getCode();

    IResultEnum setCode(Integer code);

    String getMessage();

    IResultEnum setMessage(String message);

    IResultEnum setMsgParams(Object... msgParams);

    Object[] getMsgParams();
}

这个类是一个接口类,抽象出了一些get/set方法,通过注释记录项目中错误码模块的错误码区间

3.错误码接口 实现枚举类

例如登录模块枚举类

public enum LoginResultCode implements BusinessExceptionAssert {

    LOGIN_PASSWORD_ERROR(1001, "登录密码不正确"),
    OPENID_IS_EMPTY(1014, "openId不能为空"),
    USER_NOT_FOUND(1015, "用户不存在"),
    LOGIN_EXPIRE(1016, "登录状态已过期"),
    ;

    LoginResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应信息
     */
    private String message;
    /**
     * 响应信息补充
     */
    private Object[] msgParams;


    @Override
    public Integer getCode() {
        return code;
    }

    @Override
    public LoginResultCode setCode(Integer code) {
        this.code = code;
        return this;
    }

    @Override
    public String getMessage() {
        if (ArrayUtil.isNotEmpty(msgParams)) {
            return StrUtil.format(message, msgParams);
        }
        return message;
    }

    @Override
    public LoginResultCode setMessage(String message) {
        this.message = message;
        return this;
    }

    @Override
    public IResultEnum setMsgParams(Object... msgParams) {
        this.msgParams = msgParams;
        return this;
    }

    @Override
    public Object[] getMsgParams() {
        return msgParams;
    }
}

后续进行开发时,可以根据业务添加枚举值,或者仿写此枚举类进行使用。

4.自定义异常抛出

throw new CrmebException(LoginResultCode.LOGIN_EXPIRE);

这样就抛出了一个用户登录状态已过期的自定义异常。

本页目录