如何简化这种解析方法?

时间:2019-04-18 14:02:11

标签: java error-handling coding-style

我正在编写代码以从文件中解组XML。我不知道XML是基于哪个架构的,因此我尝试使用几种Jaxb2Marshaller实例形式的架构来解组XML。

该方法需要:

  1. 尝试与每个编组者解组XML
  2. 如果成功,则返回结果对象
  3. 如果失败,请尝试下一个编组器
  4. 如果所有编组失败,则抛出带有最后一条错误消息的异常

这是当前代码:

id

我觉得这种方法在不同的抽象级别上做太多事情:

  • 反复审视警官
  • 应用编组器
  • 返回结果
  • 捕获异常
  • 抛出异常

但是我没有一种简化它的方法。每个编组器都需要try-catch块(因为我应该捕获并忽略除最后一个之外的这些XmlMappingExceptions)。该块要么返回结果对象,要么返回lastErrorMessage,这是迭代下面抛出MyException所需要的。

我能想到的唯一解决方案是创建一个人为的Result类,其中包含结果对象或错误消息,但感觉很笨拙。还有其他见解吗?

1 个答案:

答案 0 :(得分:0)

我想要具有以下粒度的方法:

private Object getObject(byte[] data) throws MyException {
    Result result;
    for (Jaxb2Marshaller marshaller : this.marshallers) {
        result = getObject(marshaller, data);
    }
    return handleError(result);
}

private Result getObject(Jaxb2Marshaller marshaller, byte[] data) {
    try {
        return Result.value(marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data))));
    } catch (final XmlMappingException e) {
        LOGGER.warn("Invalid XML", e);
        return Result.error(e.getMessage());
    }
}

private Object handleError(Result result) {
    if (result.isError()) {
        throw new MyException(result.errroMessage);
    }
    else {
        return result.value;        
    }
}

但是附加的Result类很冗长又笨拙:

private class Result {
    String errorMessage;
    Object value;

    static Result error(String errorMessage) {
        Result result = new Result();
        result.errorMessage = errorMessage;
        return result;
    }

    static Result value(Object value) {
        Result result = new Result();
        result.value = value;
        return result;
    }

    boolean isError() {
        return errorMessage != null;
    }
}