java 编译器说这个异常永远不会在相应的 try 语句的主体中抛出 - 但它_is_ 抛出

标签 java exception exception-handling try-catch javac

我有以下代码:

try {
    //jaw-ws service port operation
    port.login();
} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e.getMessage());
}

当上面的命令使用不正确的主机名运行时,我得到:

Caught Exception in login(): HTTP transport error: java.net.UnknownHostException: abc

这是正确的,也是意料之中的。我重写了专门捕获UnknownHostException的代码,如下:

import java.net.UnknownHostException;
try {
    //jaw-ws service port operation
    port.login();
} catch (UnknownHostException uhe) {
    //do something specific to unknown host exception
} catch (Exception e) {
    logger.error(Caught Exception in login(): " + e.getMessage());
}

但是,当我尝试编译它时,我得到:

[javac] foo.java: exception java.net.UnknownHostException is never thrown in body of corresponding try statement
[javac]         } catch (UnknownHostException uhe) {
[javac]                  ^

这显然是错误的,因为抛出了异常,正如我之前捕获的那样。我在这里缺少什么?

蒂亚, 卢布

最佳答案

它不会抛出 UnknownHostException。它只是出现在您实际捕获的异常的消息中。这可能是您捕获到的异常的根本原因。

要确定实际 异常,您应该打印更多细节。例如

} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e.getClass().getName() + ": " + e.getMessage());
}

或者只使用 Throwable#toString()其中已经包括异常类型和消息:

} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e);
}

或者只是将异常作为第二个记录器参数传递,如果配置良好,将打印其堆栈跟踪:

} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e.getMessage(), e);
}

根据您的评论更新:您最好的选择是按如下方式更新渔获物:

} catch (ClientTransportException e) {
    if (e.getCause() instanceof UnknownHostException) {
        // UHE.
    } else {
        // Other.
    }
}

您绝对不应根据消息进行区分。这是可移植性问题的收据。该消息是更改的敏感主题,甚至可能取决于区域设置!

关于java 编译器说这个异常永远不会在相应的 try 语句的主体中抛出 - 但它_is_ 抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3332078/

相关文章:

java - 重复抛出 ArrayIndexOutOfBoundsException 停止产生堆栈跟踪

c# - 如何检查 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

java - 捕获异常的数量是否会影响 try-code 的性能?

java - Resteasy,jaxb - 如何生成字符串集合/列表?

java - 在数组中搜索总和

java - 局部变量堆栈何时创建?

java - Java 并行流中的异常传播

java - 我正在回避异常并让它传递给 JVM,难道我不应该得到编译时错误吗?

c# - 以多种语言记录和显示 .NET 异常

java - PMD 对象构造期间调用的可覆盖方法