在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方法似乎毫无用处。
答案 0 :(得分:0)
在您的情况下,似乎recover
对您没有多大帮助。 recover
用于在Promise
失败时提供默认值(例如,在其中抛出异常)。
在这种情况下,如果List
不是node.get("name").toString()
中的字段,则您name
会在JsonNode
调用Promise
时抛出异常。这将导致node.get("name")
完全失败,因此列表的其余部分消失了。你可以将它包装在try / catch中,但这不是必需的。
如果没有null
,name
会返回null
,那么您应该在操作之前检查 for (JsonNode node : json) {
if(node.get("name") != null)
modules.add(node.get("name").toString().replace("\"", StringUtils.EMPTY));
}
:
Promise
所以答案真的是它取决于你的用例。通常,如果Promise
内发生异常,您希望失败。然后你的其余代码可以适当地处理它。但是,如果发生通常不会影响最终结果的异常,则捕获或处理它以防止它失败{{1}}(在这种情况下检查null)。