关于java:捕获一些异常而忽略其他异常 – 为什么这不起作用?

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))

注意,按照我上面的建议,通过重写代码,您完全不必编写这个复杂的布尔表达式。


依靠异常消息来知道异常的原因是什么,这真的是不安全的。

在您的案例中,您可以尝试捕获更具体的异常,如SocketTimeoutException和经典的IOException

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。