gpt4 book ai didi

Java异常抛出内省(introspection)

转载 作者:行者123 更新时间:2023-11-30 02:40:08 26 4
gpt4 key购买 nike

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

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

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

假设 try block 中的两个语句都能够抛出 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);
}

因此,无论发生什么,要么返回一个字符串,要么抛出异常。除了 getCustomReportResponse 方法如果不在 catch block 后面添加 return 语句就无法编译,这是绝对无法访问的。事实上,如果我将 translateIntoRelevantException 的内容放入 catch block 中,它就会编译,这对我来说似乎很愚蠢。

我应该补充一点,抛出的异常是运行时异常,但我也尝试过将它们设置为检查异常,但问题仍然存在。

有人可以解释一下为什么吗?

最佳答案

这是一个common problem “重新抛出”辅助方法所面对的。

编译器不知道(也没有办法表明)方法 translateIntoRelevantException 永远不会返回。

因此,它认为有一个代码路径在 try block 之后继续。因此,您必须输入“死代码”return null(或抛出新的 RuntimeException("should never come here")

您不必将其放在 try block 之后,您可以将其放在 catch 内。

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

让助手只返回异常而不是抛出异常可能会更漂亮。然后你就可以做

 throw translateIntoRelevantException(responseCode, e);

关于Java异常抛出内省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42001896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com