2017-03-29 4 views
0

Prenez cela comme exemple:Java - plaids ne fonctionne pas pour un sous-type d'une exception qui est gérée

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

Donc, j'ai ma méthode d'essai dans lequel je suis juste jeter un SSLHandshakeException qui est un sous-type de IOException.

La sortie pour ceci est "I`m handling IO exception".

Pourquoi cela se produit-il? Je m'attendais à ce que ma méthode jette le SSLHandshakeException. Y at-il une règle que catch est plus important que throws?

Je veux juste éviter d'utiliser

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

Parce que je considère qu'il est moins lisible

Répondre

2

Y a-t-il une règle selon laquelle le catch est plus important que le lancer?

Ce sont deux choses complètement différentes. Le mot-clé throws fait partie de la signature de la méthode et dit 'Cette méthode peut de jeter cette exception, donc chaque appelant devrait gérer cela explicitement.'
Que la méthode lève ou non cette exception n'est pas pertinente ici.

Comme pour l'instruction catch. SSLHandshakeException est une IOException et est donc interceptée comme prévu.

Pour obtenir le comportement que vous l'intention, vous pouvez écrire:

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

Edit: Vous dites que vous trouvez cela moins lisible. Mais honnêtement, c'est juste le meilleur moyen. Si cela se comportait de la façon que vous avez proposé, vous ne seriez jamais capable d'attraper une exception SSLHandshakeException dans une méthode qui pourrait également le lancer? Que faire si vous voulez l'attraper dans certaines conditions mais le jeter dans d'autres? Ce serait juste trop limitatif et non intuitif.

Une alternative est comme ça; mais à mon avis c'est encore moins lisible:

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, je l'ai maintenant.La chose est que j'ai besoin de ma méthode principale (dans ce cas) pour savoir comment gérer les IOExceptions autres que SSLHandshakeException et passer la responsabilité à d'autres méthodes d'appel. –

+0

J'ai modifié en fonction de votre modification à la question. Ce serait idéal si les exceptions que vous devez attraper sont des * autres * sous-classes de IOException. Alors vous pouvez juste attraper ceux et les exceptions de SSL passera par. Sinon, c'est le chemin à parcourir. – RobCo

0

C'est probablement parce que vous avez imprimé votre chaîne personnalisée au lieu de messages d'exception. Essayez ceci:

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 est une sous-classe de javax.net.ssl.SSLException Wich est une sous-classe de java.io.IOException.

donc ce code:

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

attraperez et IOException, et ainsi imprimer le message "I` m manipulation IO exception".