Catching some exceptions but ignoring others - why doesn't this work?
我有类似的东西。
1 2 3 4 5 6 7 8 9 | void func() { try { //socket disconnects in middle of ..parsing packet.. } catch(Exception ex) { if(!ex.getMessage().toString().equals("timeout") || !ex.getMessage().toString().equals("Connection reset")) { debug("Exception (run):" + ex.getMessage()); ex.printStackTrace(); } } |
为什么当我得到一个连接重置异常或超时异常时,它仍然在条件中。我试着不费吹灰之力也没有运气。
您不应该捕获所有异常,然后测试异常的错误消息。相反,只捕获那些您想要处理的异常——例如socketTimeoutException。
1 2 3 4 | catch (SocketTimeoutException ex) { // Do something... } |
使用当前的代码,您可能会捕获一些您不期望的其他类型的异常。目前,您将忽略这个异常,甚至不记录它。这会使调试发生的事情变得非常困难。如果您有一个无法处理的异常,您应该重新运行它或记录它。
I want to catch all exceptions
如果您真的想这样做,那么您可以编写如下代码:
1 2 3 4 5 6 7 8 | catch (SocketTimeoutException ex) { // Do something specific for SocketTimeoutException. } catch (Exception ex) { // Do something for all other types of exception. } |
关于您的具体错误,您已经写了:
1 | !a.equals(b) || !a.equals(c) |
此表达式的计算结果始终为true。你的意思是:
1 | !a.equals(b) && !a.equals(c) |
或同等:
1 | !(a.equals(b) || a.equals(c)) |
注意,按照我上面的建议,通过重写代码,您完全不必编写这个复杂的布尔表达式。
依靠异常消息来知道异常的原因是什么,这真的是不安全的。
在您的案例中,您可以尝试捕获更具体的异常,如
1 2 3 4 5 6 7 8 9 | void func() { try { //socket disconnects in middle of ..parsing packet.. } catch(SocketTimeoutException ex) { //In case of Time out } catch(IOException ex){ //For other IOExceptions } } |
资料来源:
[socket.connect()][3]
即使您喜欢在异常消息中查找信息,也不应该检查消息是否简单地等于"超时",但如果消息包含"超时"
〔3〕:http://下载LLNW.Oracle .COM/JavaSe/ 6 /DOCS/API/Java/NET/Socket。