2017-03-29 4 views
0

dies Nehmen wir als Beispiel:Java - Würfen arbeiten nicht für einen Subtyp von einer Ausnahme, die behandelt wird

public class TestClass { 

    public static void test() throws SSLHandshakeException { 
     throw new SSLHandshakeException("I'm a SSL Exception"); 
    } 

    public static void main(String[] args) throws SSLHandshakeException { 
     try { 
      test();   
     } catch (IOException ioe) { 
      System.out.println("I`m handling IO exception"); 
     }  
    } 
} 

Also, ich meine, in der Testmethode haben Ich werfe nur einen SSLHandshakeException das ist ein Subtyp von IOException.

Der Ausgang für dieses ist "Ich handle IO Exception".

Warum passiert das? Ich habe erwartet, dass meine Methode die SSLHandshakeException werfen wird. Gibt es eine Regel, dass catch wichtiger ist als throws?

Ich will nur

try { 
    test();  
} catch (SSLHandshakeException se) { 
    throw se; 
} catch (IOException ioe) { 
    System.out.println("I`m handling IO exception"); 
} 

mit vermeiden, da halte ich es weniger lesbar

Antwort

2

Gibt es eine Regel, dass Fangen wichtiger ist als Würfe?

Sie sind zwei völlig verschiedene Dinge. Das throws Schlüsselwort ist Teil der Methodensignatur und sagt 'Diese Methode kann diese Ausnahme auslösen, so sollte jeder Aufrufer das explizit behandeln.'
Ob die Methode tatsächlich diese Ausnahme auslöst, ist hier irrelevant.

Wie für die catch Anweisung. SSLHandshakeException ist eine IOException und so wird es erwartet abgefangen.

Um das Verhalten zu bekommen Absicht, Sie schreiben:

try { 
     test(); 
    } catch (SSLHandshakeException sslExc) { 
     throw sslExc; 
    } catch (IOException ioe) { 
     System.out.println("I`m handling IO exception that is not an SSLHandshakeException"); 
    } 

Edit: Sie sagen, Sie diese lesbar weniger finden. Aber ehrlich gesagt, das ist nur der beste Weg. Wenn es sich so verhalten würde, wie Sie es vorgeschlagen haben, könnten Sie niemals eine SSLHandshakeException in einer Methode abfangen, die sie auch auslösen könnte. Was, wenn Sie es unter bestimmten Bedingungen fangen wollen, aber es in anderen werfen? Es wäre einfach zu einschränkend und nicht intuitiv.

Eine Alternative ist so; aber meiner Meinung nach ist dies noch weniger lesbar:

try { 
     test(); 
    } catch (IOException ioe) { 
     if(ioe instanceof SSLHandshakeException) 
      throw ioe; 
     System.out.println("I`m handling IO exception that is not an SSLHandshakeException"); 
    } 
+0

Ok, ich verstehe es jetzt.Die Sache ist, ich brauche meine Hauptmethode (in diesem Fall), um zu wissen, wie IOExceptions anders als SSLHandshakeException gehandhabt werden und die Verantwortlichkeit dafür anderen Aufrufmethoden übergeben. –

+0

habe ich basierend auf deiner Bearbeitung auf die Frage bearbeitet. Es wäre ideal, wenn die Ausnahmen, die Sie abfangen müssen, * andere * Unterklassen von IOException sind. Dann können Sie nur diese fangen und die SSL-Ausnahmen werden durchlaufen. Ansonsten ist dies der richtige Weg. – RobCo

0

, die wahrscheinlich ist, weil Sie Ihre benutzerdefinierte Zeichenfolge gedruckt anstelle der Mitteilung von Ausnahme. Versuchen Sie folgendes:

public static void main(String[] args) throws SSLHandshakeException { 
    try { 
     test();   
    } catch (IOException ioe) { 
     System.out.println("I`m handling IO exception"); 
     System.out.println(ioe.getMessage()); 

    }  
} 
0

SSLHandshakeException ist eine Unterklasse von javax.net.ssl.SSLException wich eine Unterklasse von java.io.IOException ist.

Also dieser Code:

public static void main(String[] args) throws SSLHandshakeException { 
    try { 
      test();   
     } catch (IOException ioe) { 
      System.out.println("I`m handling IO exception"); 
     }  
} 

wird fangen und IOException und drucken somit die Meldung "I`m Umgang mit IO Ausnahme".

Verwandte Themen