抓住一些例外而忽略其他例外 - 为什么这不起作用?

时间:2010-08-22 18:10:04

标签: java exception string printstacktrace

我有类似的东西。

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,没有运气。

2 个答案:

答案 0 :(得分:8)

您不应捕获所有异常,然后测试异常的错误消息。相反,只捕获您打算处理的异常 - 例如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))

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

答案 1 :(得分: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)