服务器错误码和错误信息的设计和使用

在程序运行过程中,可能会出现各种业务上或非业务上的错误。为了更好的管理和维护,需要将这些从错误分门别类。这样当出现错误时能够更精确的告诉开发人员,便于开发人员快速定位错误,解决问题。本文将介绍如何定义和使用错误码、错误信息,包括:“错误信息变量的定义”、“错误码的定义”、“在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);
		……

 

posted @ 2021-12-22 16:26  Boxin-kim  阅读(506)  评论(0编辑  收藏  举报
Web Analytics
Guang Zhou Boxin