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

Langage Java Discussion :

Lever une exception dans un constructeur.


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut Lever une exception dans un constructeur.
    Bonjour à tous,

    Suite à un débat légèrement animé à mon travail, je viens solliciter votre avis sur la question suivante :

    Est-ce une bonne pratique de lever des exceptions dans le constructeur d'une classe en Java ?

    J'ai fait plusieurs recherches sur le sujet et je trouve des avis opposés. Si vous pouvez me donner les pour et contres de cette pratique, ça me permettrait d'avoir un avis plus factuel sur le sujet.

    Merci d'avance pour votre aide et à bientôt

  2. #2
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par DavidleVrai Voir le message
    Est-ce une bonne pratique de lever des exceptions dans le constructeur d'une classe en Java ?
    ben oui ... si on te passes des arguments qui ne permettent pas de construire l'objet correctement.
    deux cas:
    - violation du contrat défini par la signature: IllegalArgumentException (ou des exceptions apparentées) la faute est du ressort du code appelant
    - impossibilité qui n'est pas du ressort du code appelant: exception contrôlée (le code appelant n'a pas les moyens de vérifier a priori si ça va marcher)

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pareil pour moi, si on peut détecter une incompatibilité dès la construction de l'objet, pourquoi se priver d'une exception ?
    Généralement, l'argument contre est l'obligation de mettre le code dans un bloc try catch... autant dire qu'il n'y a pas d'arguments contre
    Enfin, je dis ça mais en fait, je n'ai jamais entendu quelqu'un s'offusquer de la possibilité d'avoir une exception dès la construction d'un objet... c'est quoi les arguments contre ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    485
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 485
    Billets dans le blog
    5
    Par défaut
    Selon la bible des bonnes pratiques (https://www.amazon.fr/Effective-Java...FXXACDS1TF85HE), on doit utiliser les exceptions "standards" pour les erreurs liées à l'utilisateur et les "Runtimes" pour les erreurs de programmations.

    Après, rien n'empêche, en appliquant ces règles, de jeter une exception à la création de l'objet.

    Je dirais même que c'est mieux de ne pas créer l'objet si celui-ci n'est pas créé.
    Du coup, comme l'erreur est lié à l'utilisateur (il ne donne pas les bon paramètres), il faut utiliser un exception standard.

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par PhilippeGibault Voir le message
    Du coup, comme l'erreur est lié à l'utilisateur (il ne donne pas les bon paramètres), il faut utiliser un exception standard.
    attention : la recommandation est un peu ambiguë (une exception "standard" ) :
    si les paramètres d'appels sont vérifiables par le code appelant alors c'est de la responsabilité du code appelant ... et donc une RuntimeException
    sinon une exception contrôlée (donc quand le code appelant n'a pas les moyens de faire les vérifs)
    Pourquoi cela? et bien si le code appelant fait les vérifications demandées et est sûr d'être conforme aux contrat d'API il serait un peut fort de café de lui demander en plus de faire un try/catch d'une exception contrôlée (checked exception)!
    S'il ne les fait pas c'est pour sa pomme: violation de contrat d'API!

    Remarque: le code appelant peut aussi volontairement faire un try/catch d'une RuntimeException parce qu'il a la flemme (ou pas l'opportunité) de faire la vérif (exemple courant: NumberFormatException).

    Il est de bon ton de préciser dans la javadoc quelles sont les exceptions claquées si violation du contrat d'API (en plus des exceptions contrôlées).

    Mais pour revenir à la question initiale: il est impensable d'avoir des objets incohérents, il ne faut pas autoriser leur création! ergo: il est impératif d'avoir des exceptions propagées par les constructeurs ... après la discussion est de savoir si ce sont des sous-classes de RuntimeException ou pas.

  6. #6
    Membre éclairé Avatar de openlowcode
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2019
    Messages : 40
    Par défaut
    Bonjour,

    je ne vois pas de raisons de ne pas mettre d'exceptions dans un constructeur. Je le fais souvent pour des vérifications que les données d'entrée du constructeur sont cohérentes. Quand ce n'est pas cohérent, je balance des "RuntimeException". J'ai mis du temps à comprendre que c'était la bonne pratique, mais cela allège vraiment le code.

    Ensuite, je laisse les RuntimeException remonter jusqu'à un haut niveau (par exemple le moteur d'exécution des actions métiers sur mon serveur), et c'est cette couche-là qui va se charger de prévenir le client que la transaction a échouée.

    Faire des try-catches à plusieurs étapes est généralement une mauvaise pratique à mon avis, cela alourdit le code, et on perd souvent même en traceabilité.

Discussions similaires

  1. Lever une exception contenue dans un if ?
    Par rXpCH dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 07/07/2008, 11h44
  2. Réponses: 5
    Dernier message: 14/05/2008, 20h08
  3. exception dans un constructeur
    Par xxiemeciel dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 18h14
  4. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

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