WMS系统异常体系结构
前言
WMS系统的异常均继承自RuntimeException, 主要作用于业务处理中异常信息的收集。故其承载的功能主要是 1.多语 2.异常列表。下面就以这两个功能分别进行描述。
多语
WMS系统的异常按业务功能区分,每个业务功能一个,下面以数据导入为例进行说明。
public class DataImportException extends BizException {
private static final long serialVersionUID = 1L;
//多语包
private static ResourceBundle resourceBundle = ResourceBundle.getBundle("exceptionConfig-import", locale);
private static ResourceBundle usEnResourceBundle = ResourceBundle.getBundle("exceptionConfig-import", usLocale);
//异常消息CODE
public static final String ERR_IMPORT_METADATA_ORG_NOT_UNIQUE = "ERR_IMPORT_METADATA_ORG_NOT_UNIQUE";
public static final String ERR_TALLYHEADER_EXIST = "ERR_TALLYHEADER_EXIST";
//构造体
public DataImportException(String code, String... values) {
super(code, getMessage(code), values);
}
public static String getMessage(@NotNull String key) {
switch (WmsStatic.getLanguage()) {
case ZH : return getCnMessage(key);
case EN : return getEnMessage(key);
default : return getCnMessage(key);
}
}
private static String getCnMessage(String key) {
try {
return resourceBundle.getString(key);
} catch (MissingResourceException e) {
logger.warn("DataImportException: " + key + "CN no named");
return NO_NAMED_EXCEPTION;
}
}
private static String getEnMessage(String key) {
try {
return usEnResourceBundle.getString(key);
} catch (MissingResourceException e) {
logger.warn("DataImportException: " + key + "EN no named");
return getCnMessage(key);
}
}
其getMessage方法即多语支持,在方法中进行语言判断。
异常列表
在BizException中,维护了一个列表,用于对多个异常信息的保存。
public class BizException extends GeniDcException {
private List<ClientMessage> errorList = new ArrayList<ClientMessage>();
//按values顺序替换message中的[]
public BizException(String code, String message, String... values) {
ClientMessage clientMessage = new ClientMessage();
clientMessage.setCode(code);
String msg = null;
if ((NO_NAMED_EXCEPTION.equalsIgnoreCase(message)) && values.length > 0) {
msg = values[0];
} else {
msg = parseMessage(message, values);
}
clientMessage.setMessage(msg);
clientMessage.setMessageCN(msg);
this.errorList.add(clientMessage);
// 统一记录下错误信息
logger.info(this.toString());
}
//无须替换
public BizException(Long id, String code, String message) {
ClientMessage clientMessage = new ClientMessage();
clientMessage.setId(id);
clientMessage.setCode(code);
clientMessage.setMessage(message);
clientMessage.setMessageCN(message);
this.errorList.add(clientMessage);
// 统一记录下错误信息
logger.info(this.toString());
}
//将map的值替换message中的[]
public BizException(Long id, String code, @NotNull String message, Map<?, ?> map) {
ClientMessage clientMessage = new ClientMessage();
clientMessage.setId(id);
clientMessage.setCode(code);
clientMessage.setContent(map);
clientMessage.setMessage(message);
clientMessage.setMessageCN(parseMessageFromMap(code, message, map));
this.errorList.add(clientMessage);
// 统一记录下错误信息
logger.info(this.toString());
}
private static String parseMessage(String message, @NotNull String... values) {
if (values.length == 0) {
return message;
}
message = message.replaceAll("\\[", "{").replaceAll("\\]", "}");
Pattern pattern = Pattern.compile("\\{(.*?)\\}");
Matcher matcher;
for (String value : values) {
matcher = pattern.matcher(message);
value = Matcher.quoteReplacement(value);
message = matcher.replaceFirst("[" + value + "]");
}
return message;
}
public BizException(@NotNull List<ClientMessage> errorList) {
this.errorList.addAll(errorList);
}
private String parseMessageFromMap(String expCode, @NotNull String message, @Nullable Map<?, ?> map) {
String[] splits = message.split("\\[");
if (splits.length > 0) {
for (int i = 0; i < splits.length; i++) {
if (splits[i].indexOf("]") > 0) {
String mapKey = splits[i].substring(0, splits[i].indexOf("]"));
String mepValue = "";
if (map == null) {
mepValue = "[]";
} else if (map.containsKey(mapKey)) {
mepValue = "[" + String.valueOf(map.get(mapKey)) + "]";
} else {
logger.warn("when throw exception[" + expCode + "], you hadn't set key [" + mapKey + "] and value into map ");
}
// replaceAll之前, 对特殊字符的处理
mepValue = Matcher.quoteReplacement(mepValue);
message = message.replaceAll("\\[" + mapKey + "\\]", mepValue);
}
}
return message;
} else {
return message;
}
}
}
最终,Exception对象成了维护异常信息的容器。
结构图
总的来说, BizExcetion 维护了异常信息列表,DataImportException 支持了多语
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。