Play Framework 2.3.1承诺内部类中的异常处理

时间:2014-06-26 15:01:16

标签: java exception-handling error-handling playframework promise

在WS API请求中实现正确的异常处理的正确方法是什么?

一个例子:

F.Promise<List<String>> modulesPromise = WS.url(requestUrl).setAuth(apiUser, apiPassword).get().map(
            new F.Function<WSResponse, List<String>>() {
                public List<String> apply(WSResponse response) {
                    List<String> modules = new ArrayList<>();

                    JsonNode json = response.asJson();
                    for (JsonNode node : json) {
                        modules.add(node.get("name").toString().replace("\"", StringUtils.EMPTY));
                    }

                    return modules;
                }
            }
    );

    modulesPromise.recover(new F.Function<Throwable, List<String>>() {
        @Override
        public List<String> apply(Throwable throwable) throws Throwable {
            Logger.error("error", throwable);
            return new ArrayList<>();
        }
    });

如果在内部类中发生异常,则会进一步抛出异常。它与方法.onFailure()的问题相同。难道不是使用try catch块来捕获潜在异常的最佳方法吗?恢复和onFailure方法似乎毫无用处。

1 个答案:

答案 0 :(得分:0)

在您的情况下,似乎recover对您没有多大帮助。 recover用于在Promise失败时提供默认值(例如,在其中抛出异常)。

在这种情况下,如果List不是node.get("name").toString()中的字段,则您name会在JsonNode调用Promise时抛出异常。这将导致node.get("name")完全失败,因此列表的其余部分消失了。你可以将它包装在try / catch中,但这不是必需的。

如果没有nullname会返回null,那么您应该在操作之前检查 for (JsonNode node : json) { if(node.get("name") != null) modules.add(node.get("name").toString().replace("\"", StringUtils.EMPTY)); }

Promise

所以答案真的是它取决于你的用例。通常,如果Promise内发生异常,您希望失败。然后你的其余代码可以适当地处理它。但是,如果发生通常不会影响最终结果的异常,则捕获或处理它以防止它失败{{1}}(在这种情况下检查null)。