1

我有类似的东西。

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();
  }
}

为什么当我收到连接重置异常或超时异常时,它仍然在条件内。我试过没有 toString 也没有运气。

4

2 回答 2

9

您不应该捕获所有异常然后测试异常的错误消息。相反,只捕获您打算处理的那些异常 - 例如SocketTimeoutException

catch (SocketTimeoutException ex)
{
    // Do something...
}

使用您当前的代码,您可能会遇到一些您没有预料到的其他类型的异常。目前你只会忽略这个异常,甚至不会记录它。这会使调试正在发生的事情变得非常困难。如果您有无法处理的异常,您应该重新抛出它或记录它。

我想捕获所有异常

如果您真的想这样做,那么您可以编写如下代码:

catch (SocketTimeoutException ex)
{
    // Do something specific for SocketTimeoutException.
}
catch (Exception ex)
{
    // Do something for all other types of exception.
}

关于您的具体错误,您写道:

!a.equals(b) || !a.equals(c)

此表达式的计算结果始终为 true。你的意思是:

!a.equals(b) && !a.equals(c)

或等效地:

!(a.equals(b) || a.equals(c))

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

于 2010-08-22T18:11:59.860 回答
0

依靠异常消息来了解异常的原因是不安全的。

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

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: //download-llnw.oracle.com/javase/6/docs/api/java/net/Socket.html#connect (java.net.SocketAddress , int)

于 2010-08-22T18:15:56.183 回答