在程序运行过程中,可能会出现各种业务上或非业务上的错误。为了更好的管理和维护,需要将这些从错误分门别类。这样当出现错误时能够更精确的告诉开发人员,便于开发人员快速定位错误,解决问题。本文将介绍如何定义和使用错误码、错误信息,包括:“错误信息变量的定义”、“错误码的定义”、“在BO层(业务层)设置错误码和错误信息”、“在Action层(控制层)判断错误码,返回响应的信息给前端”。
1、错误信息变量的定义。
在所有Model对象的父类BaseModel声明了错误信息变量:
public class BaseModel implements Serializable, Comparable<BaseModel>, Cloneable, Comparator<BaseModel> {
……
protected String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
2、错误码的定义。
ErrorInfo继承了BaseModel,声明了错误码信息,它的内部枚举类定义了错误码类型:
查看代码
public class ErrorInfo extends BaseModel {
private static final long serialVersionUID = 2033798065231436579L;
public static final ErrorInfoField field = new ErrorInfoField();
@Override
public String toString() {
return "错误码=" + errorCode + "\t错误信息=" + errorMessage;
}
protected EnumErrorCode errorCode;
// protected String errorMsg;//BaseModel基类里已经有这个数据成员
public ErrorInfo() {
errorCode = EnumErrorCode.EC_OtherError;
}
public EnumErrorCode getErrorCode() {
return errorCode;
}
public void setErrorCode(EnumErrorCode eec) {
this.errorCode = eec;
}
public enum EnumErrorCode {
EC_NoError("No error", 0), //
EC_Duplicated("Duplicated", 1), //
EC_NoSuchData("No such data", 2), //
EC_OtherError("Other error", 3), //
EC_Hack("Hack", 4), //
EC_NotImplemented("Not implemented", 5), //
EC_ObjectNotEqual("Object not equal", 6), //
EC_BusinessLogicNotDefined("Business logic not defined", 7), //
EC_WrongFormatForInputField("Wrong format for input field", 8), //
EC_Timeout("Time out", 9), //
EC_NoPermission("No permission", 10), //
EC_OtherError2("Other error 2", 11),//
EC_PartSuccess("Part success", 12),
EC_Redirect("Redirect", 13),
EC_DuplicatedSession("Duplicated session", 14), //你已经在其它地方登录
EC_InvalidSession("Invalid session", 15), // 代表会话无效,一般是因为已经断网
EC_SessionTimeout("Session time out", 16),// 会话过期
EC_WechatServerError("Wechat Server Error", 17);
private String name;
private int index;
private EnumErrorCode(String name, int index) {
this.name = name;
this.index = index;
}
public static String getName(int index) {
for (EnumErrorCode c : EnumErrorCode.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
……
各错误码类型的解释:
EC_NoError:没有错误,业务正常,程序也运行正常
EC_Duplicated:业务逻辑重复,比如创建两个相同的员工
EC_NoSuchData:对数据库不存在或已删除的数据进行操作
EC_OtherError:发生了数据库错误
EC_Hack:遇到了黑客行为,如传输了非法的数据
EC_NotImplemented:方法未实现
EC_ObjectNotEqual:对象不相等
EC_BusinessLogicNotDefined:进行业务上不允许的操作
EC_WrongFormatForInputField:数据的格式不符合
EC_Timeout:超时
EC_NoPermission:没有权限
EC_PartSuccess:部分成功
EC_Redirect:重定向
EC_DuplicatedSession:会话被踢出
EC_InvalidSession:无效的会话
EC_SessionTimeout:会话过期
EC_WechatServerError:请求微信服务器错误
3、在BO层(业务层)设置错误码和错误信息。
if (!checkCreatePermission(staffID, iUseCaseID, s)) {
lastErrorCode = EnumErrorCode.EC_NoPermission;
lastErrorMessage = "权限不足";
return null;
}
protected boolean doCheckCreate(int iUseCaseID, BaseModel s) {
String err = s.checkCreate(iUseCaseID);
if (err.length() > 0) {
lastErrorCode = EnumErrorCode.EC_WrongFormatForInputField;
lastErrorMessage = err;
logger.debug("本对象为:" + s);
return false;
}
return true;
}
protected BaseModel doCreate(int iUseCaseID, BaseModel s) {
Map<String, Object> params = s.getCreateParam(iUseCaseID, s);
BaseModel bm = mapper.create(params);
lastErrorCode = EnumErrorCode.values()[Integer.parseInt(params.get(BaseAction.SP_OUT_PARAM_iErrorCode).toString())];
lastErrorMessage = params.get(BaseAction.SP_OUT_PARAM_sErrorMsg).toString();
return bm;
}
4、在Action层(控制层)判断错误码,返回响应的信息给前端。
BaseModel bm = messageItemBO.createObject(getStaffFromSession(session).getID(), BaseBO.INVALID_CASE_ID, messageItem);
logger.info("Create messageItem error code=" + messageItemBO.getLastErrorCode());
Map<String, Object> params = new HashMap<String, Object>();
switch (messageItemBO.getLastErrorCode()) {
case EC_NoError:
logger.info("创建成功,messageItem=" + bm);
params.put(BaseAction.KEY_Object, bm);
params.put(BaseAction.JSON_ERROR_KEY, EnumErrorCode.EC_NoError.toString());
break;
case EC_BusinessLogicNotDefined:
params.put(BaseAction.JSON_ERROR_KEY, EnumErrorCode.EC_BusinessLogicNotDefined.toString());
break;
case EC_NoPermission:
logger.info("没有权限进行操作");
params.put(BaseAction.JSON_ERROR_KEY, EnumErrorCode.EC_NoPermission.toString());
break;
default:
logger.info("其他错误!");
params.put(BaseAction.JSON_ERROR_KEY, EnumErrorCode.EC_OtherError.toString());
break;
}
params.put(KEY_HTMLTable_Parameter_msg, messageItemBO.getLastErrorMessage());
logger.info("返回的数据=" + params);
……