我有以下代码:
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/