使用返回值处理异常

时间:2016-12-11 15:00:52

标签: java playframework

我正在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(),因为这会抛出它自己的例外!

什么是更简洁的出路?

1 个答案:

答案 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();
}
相关问题