Java异常抛出内省

时间:2017-02-02 12:09:28

标签: java exception compiler-errors introspection

我有一个关于Java方法内省的问题,特别是有关异常的问题。说我有以下代码:

private String getCustomReportResponse(HttpsURLConnection customReportConnection) {
    int responseCode = 0;

    try {
        responseCode = customReportConnection.getResponseCode();
        return httpResponseBodyExtractor.extractResponseBodyFrom(customReportConnection);
    } catch (IOException e) {
        translateIntoRelevantException(responseCode, e);
    }
}

假设try块中的两个语句都能抛出IOException - 在这种情况下,调用translateIntoRelevantException方法,如下所示:

private void translateIntoRelevantException(int responseCode, IOException e) {
    if(is5xxResponseCode(responseCode)) {
        throw new ServerResponseException("Could not generate report - returned response code " + responseCode, e);
    }

    throw new ReportException("GeminiReportException: Unable to parse response from HTTP body when requesting custom Gemini report.", e);
}

因此,无论发生什么,都会返回String,或抛出异常。除了getCustomReportResponse方法没有在catch块之后添加return语句而编译时,这是绝对无法访问的。事实上,如果我把translateIntoRelevantException的内容放在catch块中,它会编译,这对我来说似乎很蠢。

我应该补充一下,抛出的异常是运行时异常,但我也试过让它们检查异常,但问题仍然存在。

有人可以解释一下原因吗?

2 个答案:

答案 0 :(得分:1)

这是common problem"重新抛出"辅助方法面临。

编译器不知道(并且无法指示)方法translateIntoRelevantException永远不会返回。

因此,它认为在try阻止之后会有一个代码路径继续。所以你必须加入一个死密码" return null(或throw new RuntimeException("should never come here")

您不必在try区块之后放置它,您可以将其放在catch内。

try {
    responseCode = customReportConnection.getResponseCode();
    return httpResponseBodyExtractor.extractResponseBodyFrom(customReportConnection);
} catch (IOException e) {
    translateIntoRelevantException(responseCode, e);
    throw new RuntimeException("should never come here");
}

让助手只是return而不是抛出它可能更漂亮。然后就可以了

 throw translateIntoRelevantException(responseCode, e);

答案 1 :(得分:1)

getCustomReportResponse的汇编不应依赖于translateIntoRelevantException的实施,原因有多种:

  • translateIntoRelevantException的实施可能不可用(它可能位于单独的类中,位于单独的库中);
  • 否则translateIntoRelevantException中的任何更改都可能会破坏所有调用方法。

作为替代方案,您可以返回异常,然后将其放入客户端代码中:

private IOException translateIntoRelevantException(int responseCode, IOException e) {
    if(is5xxResponseCode(responseCode)) {
        return new ServerResponseException("Could not generate report - returned response code " + responseCode, e);
    }

    return new ReportException("GeminiReportException: Unable to parse response from HTTP body when requesting custom Gemini report.", e);
}

然后这样称呼:

throw translateIntoRelevantException(responseCode, e);