Java 套接字异常的异常处理

Java 套接字异常的异常处理,java,exception,exception-handling,Java,Exception,Exception Handling,我需要根据捕获到的异常类型做不同的事情,以下是我学到的两种可以使用的方法: 方法1: try{ .. .. }catch(SocketTimeoutExceptione){ //do something } catch(RunTimeException e){ //do something } 方法2: try{ } catch(RunTimeException e){ if (e instanceof SocketTimeo

我需要根据捕获到的异常类型做不同的事情,以下是我学到的两种可以使用的方法:

方法1:

 try{
    ..
    ..
    }catch(SocketTimeoutExceptione){
     //do something
    }
    catch(RunTimeException e){
    //do something
    }
方法2:

try{
}
catch(RunTimeException e){
if (e instanceof SocketTimeoutException) {
                 LOGGER.error(e);   

            }else {
                LOGGER.error(e);
                //do something
            }
}
我得到以下异常,这是一个已知的连接问题:异常抛出org.springframework.web.client.ResourceAccessException:POST请求“test”时发生I/O错误:读取超时;嵌套异常为java.net.SocketTimeoutException:读取超时

方法1不可行,因为它仍将进入运行时异常块。 在方法2中,我无法检查它是否是运行时异常的实例,因为套接字执行不是它的一部分。 在这种情况下我该怎么处理

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        org.springframework.core.NestedRuntimeException
          org.springframework.web.client.RestClientException
            org.springframework.web.client.ResourceAccessException
这是异常类层次结构。我认为如果您尝试捕获
ResourceAccessException
而不是
SocketTimeoutException
就可以了。但是当catch找不到特定的异常时,如果它可以捕获它的超级异常类,它就会捕获它,在您的例子中,它是
RuntimeException


Ref:

在方法1中,我不明白一旦捕获到SocketTimeoutException,RunTimeException是如何捕获它的?你错了。方法1也不会在
SocketTimeoutException
上输入
RuntimeException
块。很明显,您甚至没有尝试过这个。谢谢,这解释了为什么它没有捕获套接字超时。