IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Affichage des résultats du sondage: Êtes-vous pour ou contre cette proposition ?

Votants
385. Vous ne pouvez pas participer à ce sondage.
  • Pour

    334 86,75%
  • Contre

    51 13,25%
Langage Java Discussion :

JDK 7: Proposition 7 : Pouvoir catcher plusieurs exceptions en une fois [Débat]


Sujet :

Langage Java

  1. #41
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 552
    Points : 15 463
    Points
    15 463
    Par défaut
    D'ailleurs je viens de faire gaffe que pour ma proposition de syntaxe, il serait même plus logique de faire la déclaration de l'exception en premier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch(Exception e : InstantiationException, IllegalAccessException)
    Cela ressemblerait plus à ce qui est fait dans un foreach (ca fait trop longtemps que je suis obligé de bosser sur du 1.4, j'avais oublié l'ordre correct):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (String str : listeDeStrings)

  2. #42
    Membre confirmé
    Avatar de bmoussaud
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 218
    Points : 555
    Points
    555
    Par défaut
    Pour. Effectivement la syntaxe est peut etre à revoir.
    Mes souvenirs de C++ commence à être un peu flou,mais je crois me souvenir que le C++ utilise le séparateur ',' depuis le début ? non ?
    Benoit Moussaud - XebiaLabs - Automatisation des déploiements. Screencast & Demo

  3. #43
    Membre habitué Avatar de ludosoft
    Homme Profil pro
    Chef de projet technique
    Inscrit en
    Juillet 2002
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2002
    Messages : 99
    Points : 136
    Points
    136
    Par défaut
    Pour, mais en changeant "|" pas une ",".
    Et un d'plus en moins !

  4. #44
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 528
    Points
    2 528
    Par défaut
    Pour. J'attends ça depuis longtemps.

  5. #45
    Membre actif Avatar de DrHelmut
    Homme Profil pro
    Software craftsman - JS, Java...
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Software craftsman - JS, Java...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 215
    Points
    215
    Par défaut
    Soit j'ai mal compris la proposition, soit je ne comprends pas l'utilité...

    pour catcher plusieurs exceptions d'un coup, il y a l'héritage !

  6. #46
    Membre habitué Avatar de cysboy
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 221
    Points : 168
    Points
    168
    Par défaut
    Pour, c' est vrai que pour plusieurs exceptions catchées on veuille faire les même s traitements => diminution de code.

  7. #47
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 552
    Points : 15 463
    Points
    15 463
    Par défaut
    pourquoi annoncer
    catch(MonExcFille1,MonExcFille2 : MonExcMere)
    et pas juste les exceptions filles? Je trouve que donner la classe mere ne sert pas à grand chose.
    Le compilateur / IDE prendrait automatiquement la classe commune dans la hiérarchie. Donc pas de cast nécessaire et recours aux méthodes "communes" dans le block catch. Ce qui peut donc expliquer l'absence de la définition de cette classe puisque le compilateur saura la déterminer.
    Certes le compilateur pourrait prendre automatiquement la première classe mère commune aux exceptions, mais ça voudrait dire que la classe est définie implicitement. En plus du fait que je trouve ça moche, c'est contraire au pricipe Java qui a un typage explicite.

    Nulle par en Java une variable n'existe sans que son type soit explicitement spécifié. Pas même dans le foreach (for(String str : listeDeString)) où ce serait tout à fait possible. Je ne pense pas qu'il faille changer ça surtout, pour une modification assez mineure.

    Soit j'ai mal compris la proposition, soit je ne comprends pas l'utilité...
    pour catcher plusieurs exceptions d'un coup, il y a l'héritage !
    L'héritage n'est pas toujours une bonne solution : cf ce post qui l'explique bien

  8. #48
    Membre actif Avatar de DrHelmut
    Homme Profil pro
    Software craftsman - JS, Java...
    Inscrit en
    Octobre 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Software craftsman - JS, Java...
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 112
    Points : 215
    Points
    215
    Par défaut
    J'avais pas pensé aux exceptions de type NullPointer, IO etc que l'on risque de rameuter avec un simple catch(Exception e)... mais là encore

    Au final je dirais ni pour ni contre car ce serait un petit plus pour certains, certes, mais pour ceux qui passent par un IDE comme moi on s'en fout pas mal, à moins de tomber sur une méthode renvoyant pléthore d'exceptions (plus de 4-5, ce qui me parait extremement rare) et là à mon avis y'a un soucis dans la conception de la-dite méthode.

    Pour les codeurs "à la mano", c'est un gain assez intéressant mais carrément gadget par rapport aux avancées de Java 5 (foreach/autoboxing/polymorphisme paramétrique => vrai gain en temps de codage ET en lisibilité)

  9. #49
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Pour mais ça serait plus joli avec une virgule (quoi je suis chiant ?)
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #50
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Citation Envoyé par xavlours Voir le message
    Pour mais ça serait plus joli avec une virgule (quoi je suis chiant ?)
    Je suis contre cette proposition, mais avec une virgule à la place du pipe, ça serait déjà mieux

  11. #51
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 552
    Points : 15 463
    Points
    15 463
    Par défaut
    Citation Envoyé par DrHelmut Voir le message
    J'avais pas pensé aux exceptions de type NullPointer, IO etc que l'on risque de rameuter avec un simple catch(Exception e)... mais là encore

    Au final je dirais ni pour ni contre car ce serait un petit plus pour certains, certes, mais pour ceux qui passent par un IDE comme moi on s'en fout pas mal, à moins de tomber sur une méthode renvoyant pléthore d'exceptions (plus de 4-5, ce qui me parait extremement rare) et là à mon avis y'a un soucis dans la conception de la-dite méthode.

    Pour les codeurs "à la mano", c'est un gain assez intéressant mais carrément gadget par rapport aux avancées de Java 5 (foreach/autoboxing/polymorphisme paramétrique => vrai gain en temps de codage ET en lisibilité)
    Le temps de codage n'est pas vraiment le problème vu que le copier coller que même notepad gère à la perfection, suffit à régler ça. Par contre c'est vraiment un gain (pas enorme mais appréciable) au niveau de la lisibilité/maintenabilité : ca évite d'avoir à se coltiner plusieurs blocs catch totalement identiques.

    - Ca plombe inutilement la lisibilité si le bloc catch fait plus de 3/4 lignes
    - Si on fait une modif dans un catch il ne faut pas oublier de la reporter dans les autres.
    - Quelqu'un qui ne connait pas encore le code va devoir regarder attentivement pour finalement se rendre compte que les deux catchs sont identiques.

    La solution que j'utilise en général est de faire une méthode proccessException(...variables nécéssaires...) appelée par chacun des catch: ca limite la duplication de code a une seule ligne mais ce n'est quand même pas particulièrement élégant.

  12. #52
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 40
    Points : 68
    Points
    68
    Par défaut 100% ok
    Je suis d'accord avec ce changement et, contrairement a d'autre, je n'ai rien du tout contre la syntaxe.... apres tout, | veut dire "ou"

  13. #53
    Expert éminent sénior


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Points : 11 101
    Points
    11 101
    Par défaut
    Citation Envoyé par pierreact Voir le message
    Je suis d'accord avec ce changement et, contrairement a d'autre, je n'ai rien du tout contre la syntaxe.... apres tout, | veut dire "ou"
    Exactement. Un petit truc amusant. Durant le BOF quelqu'un a demandé pour quoi le | et pas le ||.

    Vincent
    Vincent Brabant

    Ne pas me contacter par MP ni par mail pour des questions techniques. Ma liste d'amis restera vide.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  14. #54
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 259
    Points : 607
    Points
    607
    Par défaut
    Contre pour ma part, si les différentes Exceptions ont une classe parente commune autre que Exception, on catche cette classe mère tout betement, sinon de quel type sera l'exception catchée ? Le compilateur le détermine au pif ?
    Et si les 2 exceptions n'ont rien de commun, a ce moment ca n'a pas vraiment de sens de les catcher explicitement, autant catcher Exception

  15. #55
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Citation Envoyé par Uther Voir le message
    Certes le compilateur pourrait prendre automatiquement la première classe mère commune aux exceptions, mais ça voudrait dire que la classe est définie implicitement. En plus du fait que je trouve ça moche, c'est contraire au pricipe Java qui a un typage explicite.

    Nulle par en Java une variable n'existe sans que son type soit explicitement spécifié. Pas même dans le foreach (for(String str : listeDeString)) où ce serait tout à fait possible. Je ne pense pas qu'il faille changer ça surtout, pour une modification assez mineure.


    L'héritage n'est pas toujours une bonne solution : cf ce post qui l'explique bien
    Lorsque je dis que le compilateur va prendre la première classe commune, c'est essentiellement pour illustrer comment les IDE vont fournir une complétion dans le bloc catch => liste des méthodes communes (et donc implicitement celles de la classe mère commune). Ca ne veut toujours pas dire qu'on manipule cette classe "mère" (cf. deuxième partie de mon message).

    Citation Envoyé par kpouer Voir le message
    Contre pour ma part, si les différentes Exceptions ont une classe parente commune autre que Exception, on catche cette classe mère tout betement, sinon de quel type sera l'exception catchée ? Le compilateur le détermine au pif ?
    Et si les 2 exceptions n'ont rien de commun, a ce moment ca n'a pas vraiment de sens de les catcher explicitement, autant catcher Exception
    Ca me rend malade de voir des catch Exception non justifiés et foutre par conséquent la merde quand à l'évolutivité du code (imagine que tu modifies une méthode appelée dans le bloc try et qu'elle déclare une nouvelle exception dans la clause throws, tu n'as même pas d'erreur de compilation qui t'alerte du fait que tu as un nouveau cas à gérer, pas cool si justement cette exception était à propager)

    Encore une fois, ce n'est que du sucre syntaxique. Le compilateur ne va rien faire d'autre que de traduire cela en plusieurs blocs catch comme s'ils avaient été écris. A aucun moment il n'y aurait de catch (ExceptionMere) généré.

  16. #56
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Et là le compilateur il dit quoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    catch(MonExcFille1,MonExcFille2 e) {
      processException(e);
    }
     
    public void processException(MonExcFille1 e) throws Throwable {
      // ...
    }
     
    public void processException(MonExcFille2 e) {
      // ...
    }
    Il dit que les Throwable doivent être déclarées ou catchées ou pas?

    Et dans ce cas là? Est ce qu'il renvoie une erreur parce que Throwable n'est jamais lancée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    catch(MonExcFille1,MonExcFille2 e) {
      try {
        processException(e);
      } catch (Throwable t) {
        //...
      }
    }
     
    public void processException(MonExcFille1 e) throws Throwable {
      // ...
    }
     
    public void processException(MonExcFille2 e) {
      // ...
    }
    Comme dit Uther, tout variable doit avoir un type déclaré.

  17. #57
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Il dit erreur de compilation processException est susceptible de lancer un Throwable pour MonExcFille1, comme si tu écrivais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    catch(MonExcFille1 e) {
      processException(e);
    }
    catch(MonExcFille2 e) {
      processException(e);
    }
     
    public void processException(MonExcFille1 e) throws Throwable {
      // ...
    }
     
    public void processException(MonExcFille2 e) {
      // ...
    }
    Je crois que tu cherches la petite bête, et je ne vois pas en quoi la déclaration d'un type apporterait une solution.

  18. #58
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Et avec le try catch imbriqué, il te donne aussi une erreur (Throwable is never thrown)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    catch(MonExcFille1 e) {
      try {
        processException(e);
      } catch (Throwable t) {
        //...
      }
    }
    catch(MonExcFille2 e) {
      try {
        processException(e);
      } catch (Throwable t) {
        //...
      }
    }
     
    public void processException(MonExcFille1 e) throws Throwable {
      // ...
    }
     
    public void processException(MonExcFille2 e) {
      // ...
    }
    C'est pas chercher la petite bête, un langage a une définition formelle. Pour le Java c'est (entre autres choses) d'être fortement typé. Le typage sert par exemple pour résoudre les méthodes appelées, il est aussi utilisé pour vérifier les casts que tu fais, ce code ne compile donc pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String a = "";
    Double b = (Double) a;
    Est ce que ce code compilerait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch(MonExcFille1,MonExcFille2 e) {
      MonExcFille1 ee = (MonExcFille1) e;
    }

  19. #59
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Contre.
    À mon avis,
    • soit il y a une classe/interface mère pour les exceptions qu'on veut regrouper,
    • soit les exceptions sont mal définies et cette classe/interface mère devrait exister.

  20. #60
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 552
    Points : 15 463
    Points
    15 463
    Par défaut
    Citation Envoyé par vbrabant Voir le message
    Exactement. Un petit truc amusant. Durant le BOF quelqu'un a demandé pour quoi le | et pas le ||.

    Vincent
    Je me suis également posé cette question avant d'arriver à la conclusion que aucun des deux n'était vraiment à sa place dans un catch.

    C'est vrai qu'il y a une notion de "ou" et que "||" peut sembler plus adapté car il fait un ou logique. Mais "|" et "||" sont tous deux en JAVA des opérateurs, ce qui signifie qu'ils sont sensés transformer leurs opérandes en un résultat qui sera traité.

    Au début je me suis dit ok on peut se dire que le "|" entre 2 classes retourne le premier parent commun donc IOException|SQLException vaut Exception. Dans ce cas là "|" est en effet plus adapté que "||" qui retourne un booleen quels que soient ses opérandes.

    Mais ici "|" n'est clairement pas un opérateur. En effet tout l'interet de cette proposition c'est que catch(IOException | SQLException e) ne doit pas être équivalent à catch(Excpetion e).
    Donc "|" a bien une effet de séparateur, pas d'opérateur. Dans le role du séparateur, la "," ou le ";" sont tout a fait indiqués plutot que donner a "|" un role de séparateur dans un catch et d'opérateur partout ailleurs.

Discussions similaires

  1. [Débutant] Gestion de plusieurs exceptions dans une sub
    Par Attila54 dans le forum VB.NET
    Réponses: 14
    Dernier message: 17/08/2013, 20h29
  2. [FPDF] Générer plusieurs PDF en une fois
    Par mdr_cedrick dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 02/04/2009, 17h22
  3. [MySQL] plusieurs requetes en une fois
    Par maximenet dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 31/07/2006, 12h57
  4. [MFC] Checker plusieurs bouton en une fois
    Par kacedda dans le forum MFC
    Réponses: 2
    Dernier message: 08/03/2006, 18h10
  5. Réponses: 13
    Dernier message: 21/12/2005, 13h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo