在程序運行過程中,可能會出現各種業務上或非業務上的錯誤。為了更好的管理和維護,需要將這些從錯誤分門別類。這樣當出現錯誤時能夠更精確的告訴開發人員,便於開發人員快速定位錯誤,解決問題。本文將介紹如何定義和使用錯誤碼、錯誤信息,包括:“錯誤信息變量的定義”、“錯誤碼的定義”、“在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);
……