java - java 11 HTTP 客户端上的 "java.io.IOException: Connection timed out"VS HttpTimeoutException

标签 java java-11 timeoutexception java-http-client

我正在使用 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/

    相关文章:

    java - SpringMVC : No mapping found for HTTP request

    java对象查询(在java对象列表上应用SQL逻辑)

    java - Hibernate 4 与 Java 11 兼容吗?

    docker - 如何在 Docker 中为 Java 11 设置内存限制?

    c# - 将在 using 语句中返回关键字,保持连接打开?

    java - 用于 I/O 超时的最佳异常类型是什么?

    java - 将测试用例和结果导入 Rally 时如何避免 504 错误?

    java - Hibernate 将对象保存到多个 session

    java - 如何在 Java 中比较字符串?

    java - Hibernate 延迟加载不适用于 java 11 中的 forEach()