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

SSp*_*oke 1 java string exception 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 9

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

catch (SocketTimeoutException ex)
{
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

使用当前代码,您可能会捕获一些您不期望的其他类型的异常.目前,您将忽略此异常,甚至不记录它.这可能使调试正在进行的操作非常困难.如果您有一个无法处理的异常,则应重新抛出或记录它.

我想抓住所有例外情况

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

catch (SocketTimeoutException ex)
{
    // Do something specific for SocketTimeoutException.
}
catch (Exception ex)
{
    // Do something for all other types of exception.
}
Run Code Online (Sandbox Code Playgroud)

关于你的具体错误,你写了:

!a.equals(b) || !a.equals(c)
Run Code Online (Sandbox Code Playgroud)

此表达式始终求值为true.你的意思是:

!a.equals(b) && !a.equals(c)
Run Code Online (Sandbox Code Playgroud)

或等效地:

!(a.equals(b) || a.equals(c))
Run Code Online (Sandbox Code Playgroud)

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