当我抓住时,我需要以不同的方式处理它SocketTimeoutException
.我发现的唯一一件事就是依靠getMessage()
.到目前为止,我发现了两个:
java.net.SocketTimeoutException: connect timed out
java.net.SocketTimeoutException: Read timed out
Run Code Online (Sandbox Code Playgroud)
消息(连接超时,读取超时)是否已硬编码?他们在哪里生成?这些消息至少有任何常量值吗?
所以,这就是我的成名之处。在这里,我们沿着 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 总是感觉很脏,并且在未来的版本中会被子表破坏!
归档时间: |
|
查看次数: |
3211 次 |
最近记录: |