WMS系统异常体系结构

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对象成了维护异常信息的容器。

结构图

clipboard.png
总的来说, BizExcetion 维护了异常信息列表,DataImportException 支持了多语

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值