如何区分SocketTimeoutException

Wei*_*Zhu 14 java exception

当我抓住时,我需要以不同的方式处理它SocketTimeoutException.我发现的唯一一件事就是依靠getMessage().到目前为止,我发现了两个:

java.net.SocketTimeoutException: connect timed out
java.net.SocketTimeoutException: Read timed out
Run Code Online (Sandbox Code Playgroud)

消息(连接超时,读取超时)是否已硬编码?他们在哪里生成?这些消息至少有任何常量值吗?

Luk*_*uth 1

所以,这就是我的成名之处。在这里,我们沿着 StackTrace 走下去,寻找异常的来源方法。

public class ExceptionOriginTracing {

    public static void main(String[] args){
        try {
            originOne();
            originTwo();
        } catch (Exception e){
            // Now for the magic:
            for (StackTraceElement element : e.getStackTrace()){
                if (element.getMethodName().equals("originOne")){
                    System.out.println("It's a read error!");
                    break;
                } else if (element.getMethodName().equals("originTwo")){
                    System.out.println("It's a write error!");
                    break;
                }
            }
        }
    }

    public static void originOne() throws Exception{
        throw new Exception("Read Failed...", null);
    }

    public static void originTwo() throws Exception{
        throw new Exception("Connect failed...", null);
    }
}
Run Code Online (Sandbox Code Playgroud)

与解析 Exception 给出的消息的区别在于,简单的字符串比实际方法的名称更有可能更改。

除此之外,这不是一个最佳解决方案!但遗憾的是,这里没有最佳解决方案。

此外,使用这种方法时,在使用源混淆时必须格外小心,这将更改方法名称并因此更改 的返回值getMethodName()


设计这样的东西时,正确的方法是将异常包装在一个新的异常中,它提供了通过使用标志或枚举来实际找出真正来源的方法。

解析消息/StackTrace 总是感觉很脏,并且在未来的版本中会被子表破坏!