Frage

Ich habe etwas ähnlich.

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

Warum ist es, dass, wenn ich eine Verbindung zurückgesetzt Ausnahme oder eine Timeout-Ausnahme erhalten, geht es nach wie vor innerhalb der Zustand. Ich habe versucht, ohne toString und ohne Glück.

War es hilfreich?

Lösung

Sie sollten nicht alle Ausnahmen abfangen und testen Sie dann die Fehlermeldung der Ausnahme. Statt nur die Ausnahmen abfangen, die Sie behandeln beabsichtigen - zum Beispiel: SocketTimeoutException .

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

Mit Ihrem aktuellen Code können Sie eine andere Art von Ausnahme seines Fang, dass Sie nicht erwartet haben. Zur Zeit werden Sie nur diese Ausnahme ignorieren, nicht einmal anzumelden. Dies kann es sehr schwierig zu debuggen, was los ist. Wenn Sie eine Ausnahme haben, dass Sie nicht umgehen können Sie entweder sollte es erneut auslösen oder es loggt sein.

  

Ich möchte alle Ausnahmen fangen

Wenn Sie wirklich das tun wollen, dann können Sie Ihren Code schreiben, wie folgt:

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

Im Hinblick auf spezifische Fehler haben Sie geschrieben:

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

Dieser Ausdruck ergibt immer wahr. Was Sie meinte, war:

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

oder äquivalent:

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

Beachten Sie, dass der Code durch Umschreiben wie ich oben Sie völlig unverbindlich vermeiden, diesen komplizierten boolean Ausdruck zu schreiben.

Andere Tipps

Es ist wirklich nicht sicher auf Ausnahmen Nachrichten verlassen, um zu wissen, was die Ursache Ihrer Ausnahme ist.

In Ihrem Fall können Sie versuchen, mehr spezifische Ausnahmen zu fangen, wie SocketTimeoutException und die klassische 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
    }
}

Quellen:

[Socket.connect ()] [3]

Auch wenn Sie Informationen in Ausnahmen Nachrichten zu suchen, bevorzugen, sollten Sie nicht überprüfen, ob die Nachricht einfach gleich „Timeout“, aber wenn die Nachricht enthält „timeout“

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top