我正在Play框架中构建一个应用程序,并且在我的一个函数定义中遇到了挑战。这不是Play Framework的问题,但它适用于Play,因为sbt compile
因为此错误而失败。
所以我在我的一个班级中有这个功能:
private JSONObject getJsonObject(String url) {
HttpResponse<JsonNode> response;
try {
response = Unirest.get(url).asJson();
} catch (UnirestException e) {
Logger.error("Failed to GET data. Connection string was: " + url);
e.printStackTrace();
}
return response.getBody().getObject();
}
我决定在函数中捕获异常的原因是我不希望我的函数throw
出现异常。因为这样,这个try-catch
需要在调用此函数的多个地方完成。我可以通过放置一个throws UnirestExecption
来避免这种情况,但这会在整个函数堆栈中一直冒出来,一直到类构造函数。
但是,使用当前代码,我的IDE和sbt compile
都告诉我:
[error]: variable response might not have been initialized
在这种情况下如何解决这个问题?我似乎无法做new HttpResponse()
,因为class definition对我来说太可怕了。我当然不能做另一个Unirest.get()
,因为这会抛出它自己的例外!
什么是更简洁的出路?
答案 0 :(得分:1)
如果抛出异常,您期望响应是什么?
如果response = Unirest.get(url).asJson();
抛出异常,则您的响应对象将被取消初始化。
您可以将捕获的异常包装起来并重新抛出它:
private JSONObject getJsonObject(String url) {
HttpResponse<JsonNode> response;
try {
response = Unirest.get(url).asJson();
} catch (UnirestException e) {
Logger.error("Failed to GET data. Connection string was: " + url);
throw new RuntimeException(e);
}
return response.getBody().getObject();
}
或如果GET请求失败则返回一些默认值:
private JSONObject getJsonObject(String url) {
HttpResponse<JsonNode> response;
try {
response = Unirest.get(url).asJson();
} catch (UnirestException e) {
Logger.error("Failed to GET data. Connection string was: " + url);
return null;
}
return response.getBody().getObject();
}