Поймать некоторые исключения, но игнорировать другие - почему это не работает? - PullRequest
1 голос
/ 22 августа 2010

У меня что-то похожее на это.

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 ]

8 голосов
/ 22 августа 2010

Не следует перехватывать все исключения, а затем проверять сообщение об ошибке исключения. Вместо этого перехватывайте только те исключения, которые вы намереваетесь обработать - например, 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))

Обратите внимание, что, переписав свой код, как я предлагал выше, вы полностью избежите написания этого сложного логического выражения.

0 голосов
/ 22 августа 2010

На самом деле небезопасно полагаться на сообщения об исключениях, чтобы знать причину вашего исключения.

В вашем случае вы можете попытаться перехватить более конкретные исключения, такие как 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]

Даже если вы предпочитаете искать информацию в сообщениях об исключениях, вам не следует проверять, равняется ли сообщение просто «timeout», но содержит ли сообщение «timeout»

[3]: http://download -llnw.oracle.com / javase / 6 / docs / api / java / net / Socket.html # connect (java.net.SocketAddress , int)

...