java - 使用返回值处理异常

标签 java playframework

我正在 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/

相关文章:

java - 在遍历事件处理程序集合时,如何安全地从回调中移除处理程序?

java - 对具有空值的数组进行排序

javascript - Play Framework : Display data as html table

java - 从同一 session 同时请求同一端点会在 Play 中产生问题

macos - Playframework 重新加载无法在 Mac OSX 上运行

java - 使用 JPA 检查表属性(即大小)

java - JGraphT - 使用 BreadthFirstIterator 查找路径

Java:使用自己的终端启动子进程

linux - 如何支持多个 server.pid 文件?

web-applications - Play Framework 部署到网络主机