自定义异常与抛出
自定义异常与抛出
在 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);
这样就抛出了一个用户登录状态已过期的自定义异常。