我正在使用 Java 11 http 客户端( java.net.http
)。send()
方法声明了这些异常:
@throws IOException
@throws InterruptedException
@throws IllegalArgumentException
@throws SecurityException
我对捕获超时引起的异常感兴趣。我认为最好的方法是捕捉
HttpTimeoutException
(扩展 IOException
)但是,我有时会看到当超时发生时抛出的异常是:
java.io.IOException: Connection timed out
现在我想知道:最佳答案
@Override
public <T> HttpResponse<T>
send(HttpRequest req, BodyHandler<T> responseHandler)
throws IOException, InterruptedException
{
CompletableFuture<HttpResponse<T>> cf = null;
try {
cf = sendAsync(req, responseHandler, null, null);
return cf.get();
} catch (InterruptedException ie) {
if (cf != null )
cf.cancel(true);
throw ie;
} catch (ExecutionException e) {
final Throwable throwable = e.getCause();
final String msg = throwable.getMessage();
if (throwable instanceof IllegalArgumentException) {
throw new IllegalArgumentException(msg, throwable);
} else if (throwable instanceof SecurityException) {
throw new SecurityException(msg, throwable);
} else if (throwable instanceof HttpConnectTimeoutException) {
HttpConnectTimeoutException hcte = new HttpConnectTimeoutException(msg);
hcte.initCause(throwable);
throw hcte;
} else if (throwable instanceof HttpTimeoutException) {
throw new HttpTimeoutException(msg);
} else if (throwable instanceof ConnectException) {
ConnectException ce = new ConnectException(msg);
ce.initCause(throwable);
throw ce;
} else if (throwable instanceof SSLHandshakeException) {
// special case for SSLHandshakeException
SSLHandshakeException he = new SSLHandshakeException(msg);
he.initCause(throwable);
throw he;
} else if (throwable instanceof SSLException) {
// any other SSLException is wrapped in a plain
// SSLException
throw new SSLException(msg, throwable);
} else if (throwable instanceof IOException) {
throw new IOException(msg, throwable);
} else {
throw new IOException(msg, throwable);
}
}
}
请参阅下面的方法,它是 HttpClientImpl.java 的内部方法。处理您想要管理的所有异常,并相应地实现您的代码。
如果您处理 HttpConnectTimeoutException、IOException、HttpTimeoutException,那么您就被覆盖了。
关于java - java 11 HTTP 客户端上的 "java.io.IOException: Connection timed out"VS HttpTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63666346/