2010-11-11 10 views
4

java.net.ConnectException s'étend java.net.SocketExceptionL'instance de travail pour les exceptions sous-classées?

Si je fais ce qui suit, répondra-t-il aux deux exceptions? Par exemple, si j'attrape une exception «parente» en utilisant instanceof, cela inclut-il des exceptions sous-classées?

catch (Exception e) 
{ 
    if (e instanceof java.net.SocketException) 
    { 
     System.out.println("You've caught a SocketException, OR a ConnectException"); 
    } 
} 

(et pour l'enregistrement, oui je sais Attraper les exceptions simples est mauvais, juste à l'utiliser pour cet exemple;))

+3

Pourquoi ne pas simplement l'essayer? (oui, vous attrapez). – Roman

+1

Il vous aurait fallu moins de temps pour l'essayer que de le demander ici ... –

+0

Qui a dit que toute question posée sur SO est posée par quelqu'un assis avec un IDE? Je n'ai pas d'environnement de développement sur mon iPhone ... – Jimmy

Répondre

11

Des exceptions sont des classes régulières, donc instanceof fonctionne très bien pour eux.

Mais vous n'avez pas besoin d'une telle chose. Le résultat suivant aboutit au même résultat:

try { 
    throw new ConnectException(); 
} catch (SocketException e) { 
    System.out.println("You've caught a SocketException, OR a ConnectException"); 
} 
+0

Et si vous deviez faire du code commun pendant la clause catch mais que vous deviez lancer une autre exception spécifique en fonction de l'exception interceptée? Alors instanceof est le plus propre à droite? – pete

+0

ou différentes clauses de capture? – Bozho

3

Oui, il répondra aux deux. Parce que ConnectionException est une exception SocketException, c'est aussi une instance de celle-ci.

3

Bozho a déjà donné la bonne réponse. Je ne connais pas votre usecase particulier, mais vous préféreriez attraper différentes exceptions:

try { 
    ... 
} 
catch (SocketException ex) { 
    System.out.println("You've caught a SocketException, OR a ConnectException"); 
} 
catch (Exception ex) { 
    ... 
} 
0

Oui, c'est comment instanceof fonctionne. Pour les exceptions, il est plus commun d'utiliser quelque chose comme ceci si vous vous souciez des différentes exceptions. Cela fonctionne parce que la JVM va travailler dans la liste des instructions catch dans l'ordre et exécuter le premier qui correspond.

catch(ConnectException e) 
{ 
    //got ConnectException 
} 
catch(SocketException e) 
{ 
    /got a SocketException 
} 
catch(Exception e) 
{ 
    //got some other exception 
} 

Ou ci-dessous si vous ne se soucient de la différence entre la connexion et l'exception Socket

catch(SocketException e) 
{ 
    //got a SocketException or a subclass e.g. ConnectionException 
} 
catch(Exception e) 
{ 
    //got another type of exception 
} 
2

Je sais qu'il est maintenant une bonne façon, mais si vous voulez faire une action personnalisée dans un de nombreux endroits dans le code vous pouvez faire quelque chose comme ceci: classe publique ImageIOExecption étend l'exception {

Exception ex; 

public ImageIOExecption(Exception ex) { 
    this.ex = ex; 
    doCatch(); 
} 

private void doCatch() { 
    System.err.println(ex.getClass()); 

    if (ex instanceof java.net.SocketTimeoutException) { 
     System.out.println("You've caught a SocketTimeoutException, OR a ConnectException"); 
    } 

    if (ex instanceof java.net.SocketException) { 
     System.out.println("You've caught a SocketException, OR a ConnectException"); 
    } 


} 
} 

public BufferedImage getBufferedImage() { 
     try { 
      BufferedImage srcImage = ImageIO.read(is); 
      is.close(); 
      return srcImage; 
     } catch (Exception ex) { 
      new ImageIOExecption(ex); 
     } 
     return null; 
    }