我正在 Play 框架中构建一个应用程序,并且在我的一个函数定义中面临挑战。这实际上并不是一个 Play 框架问题,但它适用于 Play,因为 sbtcompile
由于此错误而失败。
所以我的一个类中有这个函数:
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();
}
我决定在函数中捕获异常的原因是我不希望我的函数抛出
异常。因为这样,这个 try-catch
需要在调用该函数的多个地方完成。我可以通过放置一个 throws UnirestExecption 来避免这种情况,但这会在整个函数堆栈中一直冒泡,一直到类构造函数。
但是,使用当前代码,我的 IDE 和 sbtcompile
都告诉我:
[error]: variable response might not have been initialized
在这种情况下我该如何摆脱这个困境?我似乎无法执行 new HttpResponse()
因为 class definition我觉得太可怕了。我当然不能再执行一次 Unirest.get()
因为那会抛出自己的异常!
什么是更简洁的出路?
最佳答案
如果抛出异常,您期望的响应是什么?
如果 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();
}
关于java - 使用返回值处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41087536/