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 :

Question sur la fonction des exceptions


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Question sur la fonction des exceptions
    Bonjour à tous.

    Je suis actuellement en train d'apprendre le langage Java et j'ai une question concernant la bonne pratique des exceptions selon vous.

    Dans un projet avec une amie, je suis en train de développer une classe Date, qui, basiquement, contient une date et fait plein d'opérations et de vérifications dessus.
    En particulier, il y a plein de cas dans lesquels instancier une Date est absurde, qui dépendent du jour, du mois et de l'année passées en paramètre.

    Nous voulons donc faire en sorte qu'à chaque fois que l'utilisateur du programme tente d'instancier une Date impossible, le programme lui demande de rentrer à nouveau la ou les valeur(s) qui pose(nt) problème : le jour, le mois ou l'année.

    En fait, nous avons pensé à deux moyens : le premier consiste à utiliser plusieurs exceptions (JourException, Mois Exception et AnneeException) qu'il faudra que le programme catch à chaque instanciation d'une Date. Le second consiste à passer en paramètre au constructeur un tableau de 3 booléens que le constructeur de Date remplit avec des TRUE si les trois paramètres sont corrects, ou avec des FALSE au niveau des paramètres incorrects, auquel cas le programme devrait tester ce tableau à chaque instanciation d'une Date pour savoir si la Date est correctement instanciée.

    En fait, je me demande quelle est la manière la plus logique de résoudre ce type de problèmes. En effet les exceptions me semblent être quelque chose qui devraient être réservées aux erreurs et le fait d'entrer une Date impossible n'est pas à proprement parler une erreur du programme mais juste une manipulation attendue et gérée par le programme.
    Je voudrais donc savoir quelle est la "bonne" philosophie d'après vous SVP ?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Effectivement, ce n'est pas bon de se baser sur les exceptions pour faire de la logique de branchement. Ceci dit certaines apis de base java ne se privent pas

    Puisque tu fais l'analyse dans le constructeur, tu pourrais faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Date date  = new Date (jour,mois,annee);
    if (!date.isValid()){
       if (!date.isMonthValid()){
       }
       if (!date.isDayValid()){
       }
    }
    Créer une Exception par valeur d'erreur, c'est trop.

  3. #3
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par Tokapi Voir le message
    En fait, je me demande quelle est la manière la plus logique de résoudre ce type de problèmes. En effet les exceptions me semblent être quelque chose qui devraient être réservées aux erreurs et le fait d'entrer une Date impossible n'est pas à proprement parler une erreur du programme mais juste une manipulation attendue et gérée par le programme.
    Je voudrais donc savoir quelle est la "bonne" philosophie d'après vous SVP ?
    sujet délicat
    en fait les exceptions peuvent être utilisées pour mettre en place un comportement "normal" qui signale une donnée hors borne.
    Dans le cas de ta classe la question n'est pas tout à fait évidente au niveau du principe:
    - une exception de type RuntimeException est utilisée pour violation de contrat d'API (valeur fantaisiste passée en paramètre)
    - un exception "normale" est utilisée si on considère que le code appelant n'est pas trop en mesure de "voir l'erreur"
    C'est pour cela qu'on met en place des exceptions controlées (dans ton cas le constructeur de MaDate déclare un "throws ExceptionValeurDate" ou queque chose dans ce style)

    Pas évident de faire un choix: paramètre négatif est une violation du contrat d'API mais est ce que le 29 février de l'année en question est une violation de ce contrat ?

    Je suis modérément d'accord avec _tchize sur une notion de contrôle a posteriori (bon ok dans le cas de Date) mais au niveau du principe je suis moyennement chaud.
    A mon (pas très humble) avis les exceptions ont justement été créées pour forcer des contrôles de valeur.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Oui, si on veux juste savoir que c'est pas bon, je trouve aussi normal de lancer une exception. Mais ici chose problématique on veux savoir quel paramètres est en erreur. Le tout propre serait de passer par une factory simple qui contiendrait les isvalid et lancerait une exception si on essaie de forcer la création. Mais alors on retire au constructeur le droit de checker les arguments.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Salut, merci pour vos réponses.

    Du coup ce que j'en déduis et que je me dis (dites-moi si j'ai bon), c'est qu'au fond c'est pas si mal de faire une exception du point de vue objet parce que ça empêche l'utilisateur de ne pas gérer le problème s'il tente d'instancier une Date impossible, en quelque sorte ça force à penser à faire le test, non ? Sinon je me dis qu'il faudrait que le programme mette des valeurs par défaut pour que l'objet soit propre, ce qui me semble un peu idiot...

Discussions similaires

  1. Petite question sur le typage des fonctions
    Par Dim Me As New Idiot dans le forum F#
    Réponses: 4
    Dernier message: 13/07/2010, 10h41
  2. Question sur l'appel des fonctions
    Par ouadie99 dans le forum C#
    Réponses: 6
    Dernier message: 29/06/2010, 14h56
  3. Petite question sur la gestion des exception
    Par Wizard50 dans le forum C#
    Réponses: 1
    Dernier message: 05/05/2010, 09h17
  4. [Framework] Question sur la gestion des exceptions et du @Transactional
    Par franckbis dans le forum Spring
    Réponses: 0
    Dernier message: 13/01/2010, 11h53
  5. Réponses: 3
    Dernier message: 21/10/2006, 16h03

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