服務器錯誤碼和錯誤信息的設計和使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM