我试图在下面的代码中抛出一个超时异常。我尝试了一个简单的条件,但这不是正确的方法。我的问题是如何区分超时异常和SOAPException?
URL endpoint = new URL(null,
urlStr,
new URLStreamHandler() {
// The url is the parent of this stream handler, so must create clone
protected URLConnection openConnection(URL url) throws IOException {
URL cloneURL = new URL(url.toString());
HttpURLConnection cloneURLConnection = (HttpURLConnection) cloneURL.openConnection();
// TimeOut settings
cloneURLConnection.setConnectTimeout(10000);
cloneURLConnection.setReadTimeout(10000);
return cloneURLConnection;
}
});
try {
response = connection.call(request, endpoint);
} catch (SOAPException soapEx) {
if(soapEx.getMessage().contains("Message send failed")) {
throw new TimeoutExpirationException();
} else {
throw soapEx;
}
}发布于 2018-03-06 13:51:42
经过几个小时的测试,我找到了解决SOAPException超时相关异常的正确方法。因此,解决方案是接受异常的父原因字段,并检查它是否是SocketTimeoutException的实例。
try {
response = connection.call(request, endpoint);
} catch (SOAPException soapEx) {
if(soapEx.getCause().getCause() instanceof SocketTimeoutException) {
throw new TimeoutExpirationException(); //custom exception
} else {
throw soapEx;
}
}发布于 2018-02-21 17:15:23
下面的行来自call方法的开放jdk源代码。在代码中,它们只使用Exception (也是使用链接)捕获?评论)。我不认为有其他方法,除非Oracle jdk对此有不同的处理方式。
您仍然可以尝试类似if(soapEx.getCause() instanceof SomeTimeoutException)的方法(不确定这是否有效)。
try {
SOAPMessage response = post(message, (URL)endPoint);
return response;
} catch (Exception ex) {
// TBD -- chaining?
throw new SOAPExceptionImpl(ex);
} 如果您想检查源代码HttpSoapConnection
https://stackoverflow.com/questions/48909037
复制相似问题