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

C# Discussion :

Exceptions pour la gestion des saisies utilisateurs [Débutant]


Sujet :

C#

  1. #1
    Membre du Club Avatar de CompuTux
    Homme Profil pro
    Développeur Python et Django
    Inscrit en
    Août 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Python et Django
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut Exceptions pour la gestion des saisies utilisateurs
    Bonjour à tous !

    Dans le cadre de mon apprentissage de C#, je développe (en procédural et en mode console) un petit programme d'arithmétique qui, pour le moment, permet de décomposer un nombre entier naturel (un long) en produit de ses facteurs premiers.

    Il s'agit d'une boucle principale dans la méthode Main du programme qui demande à l'utilisateur de saisir un mot clé, qui appelle la fonction correspondante.

    Les mot clés sont rassemblés dans une enum Commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum Commandes { Aide, Décomposition, Quitter };
    J'ai une fonction SaisieCommande() qui gère les commandes saisies par l'utilisateur :

    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
    public static Commandes SaisieCommande()
            {
                Console.Write("Entrez une commande (Aide, Quitter, etc.) : ");
     
                string saisie = Console.ReadLine();
     
                Commandes commandeSaisie = (Commandes)Enum.Parse(typeof(Commandes), saisie, true);
     
                foreach (Commandes commande in Enum.GetValues(typeof(Commandes)))
                {
                    if (!commande.Equals(commandeSaisie))
                    {
     
                        throw new ArgumentException("Vous avez entré une mauvaise commande !");
     
                    }
                }
     
                return commandeSaisie;
            }
    J'aimerais que cette fonction puisse gérer les erreurs de saisie utilisateur en renvoyant l'exception ArgumentException("Vous avez entré une mauvaise commande !").

    Plusieurs questions se posent :

    1) Est ce que l'exception choisie est la meilleure pour ce cas de figure ?
    2) Comment faire pour comparer la saisie utilisateur à toutes les commandes possibles afin de savoir si l'exception doit être renvoyée ou pas ? Car actuellement mon programme renvoie l'exception même quand je saisie une bonne commande. J'en suis conscient !

    Voilà, je vous remercie d'avance pour toute aide !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    N'utilise pas des exceptions pour ça, ce n'est pas fait pour ça ! Les exceptions, comme leur nom l'indique, sont faites pour gérer des cas exceptionnels/non prévisibles. Toi tu t'en sers pour faire du contrôle de flux, c'est une très mauvaise pratique... Le fait que l'utilisateur ait fait une erreur de saisie n'est pas une situation exceptionnelle, c'est quelque chose que tu peux vérifier et gérer proprement.

  3. #3
    Membre du Club Avatar de CompuTux
    Homme Profil pro
    Développeur Python et Django
    Inscrit en
    Août 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Python et Django
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Merci pour ta réponse, mais mince alors ! Moi qui pensait avoir à peu près compris que les Exceptions pouvaient aussi être utilisées pour faire du contrôle de saisie....

    En effet dans un MSDN Training Workbook de Microsoft, j'ai vu que l'auteur utilisait un ArgumentOutOfRangeException pour contrôler la saisie d'un numéro de jour dans une année :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Console.Write("Please enter a day number (between 1 and {0}) : ", maxDayNum);
     
                    line = Console.ReadLine();
                    dayNum = int.Parse(line);
     
                    if (dayNum < 1 || dayNum > maxDayNum)
                    {
                        throw new ArgumentOutOfRangeException("Day out of Range !");
                    }
    Voilà pourquoi je pensais utiliser l'ArgumentException pour gérer une erreur de saisie dans mon programme...

    Visiblement j'ai toujours pas tout compris... Peux tu m'expliquer comment contrôler proprement la saisie utilisateur dans mon programme ?

  4. #4
    Membre du Club Avatar de CompuTux
    Homme Profil pro
    Développeur Python et Django
    Inscrit en
    Août 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Python et Django
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut [Résolu]
    Bon j'apprends, et donc j'ai suivi ton conseil, je t'en remercie, tu as raison car c'est très lourd les exceptions qui interrompent le programme !

    Voici donc le code de ma solution :

    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
    23
    24
    25
    26
    27
    #region Fonction SaisieCommande
            public static Commandes SaisieCommande()
            {
                // Cette fonction gère la saisie d'une commande par l'utilisateur
     
                Commandes commandeSaisie;
     
                Console.Write("Entrez une commande (Aide, Quitter, etc.) : ");
     
                string saisie = Console.ReadLine();
     
                bool saisieOK = Enum.TryParse(saisie, true, out commandeSaisie);
     
                if (saisieOK)
                {
     
                    return commandeSaisie;
                }
     
                else
                {
                    return Commandes.Erreur;
                }
     
     
            }
            #endregion
    Il fonctionne bien et il n'est pas trop cochon je trouve...

    Qu'en pensez vous svp ??

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par frenchem67 Voir le message
    Merci pour ta réponse, mais mince alors ! Moi qui pensait avoir à peu près compris que les Exceptions pouvaient aussi être utilisées pour faire du contrôle de saisie....
    Ca peut être utilisé pour ça, mais en interceptant les exceptions qui se produisent quand tu essaies d'interpréter la saisie, pas en en lançant de nouvelles. Par exemple, si tu fais un DateTime.Parse et que ça lève une exception, tu l'interceptes pour détecter l'erreur de saisie (bon, c'est un peu bidon comme exemple, il vaut mieux utiliser TryParse de toutes façons...)

    En pratique, on lève rarement des exceptions dans la partie "interface utilisateur" d'une application. En revanche, dans une application multi-couches il est fréquent de lever une exception dans une couche basse pour faire remonter un problème aux couches supérieures (et dans ce cas les couches supérieures doivent intercepter et gérer cette exception).

    Citation Envoyé par frenchem67 Voir le message
    En effet dans un MSDN Training Workbook de Microsoft, j'ai vu que l'auteur utilisait un ArgumentOutOfRangeException pour contrôler la saisie d'un numéro de jour dans une année :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Console.Write("Please enter a day number (between 1 and {0}) : ", maxDayNum);
     
                    line = Console.ReadLine();
                    dayNum = int.Parse(line);
     
                    if (dayNum < 1 || dayNum > maxDayNum)
                    {
                        throw new ArgumentOutOfRangeException("Day out of Range !");
                    }
    C'est un très bon exemple... de ce qu'il ne faut pas faire
    C'est d'ailleurs assez malheureux de voir un truc comme ça dans des tutos de MS

    Citation Envoyé par frenchem67 Voir le message
    Voici donc le code de ma solution :

    ...

    Qu'en pensez vous svp ??
    C'est pas mal
    Il n'y a pas vraiment une façon universelle de faire ça, ça dépend un peu du type d'application (console, windows, web...) et de son mode de fonctionnement. Dans ton cas, cette solution me semble assez adaptée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche un parttern pour la gestion des profils utilisateurs
    Par foufar2009 dans le forum Design Patterns
    Réponses: 2
    Dernier message: 15/04/2011, 20h09
  2. Tables pour la gestion des profils d'utilisateurs
    Par NeoGeoo dans le forum Débuter
    Réponses: 7
    Dernier message: 06/11/2010, 23h09
  3. Réponses: 0
    Dernier message: 15/04/2009, 14h51
  4. Meilleur cms pour la gestion des utilisateurs ou un intranet
    Par ludo007 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 08/04/2009, 21h10
  5. Réponses: 3
    Dernier message: 04/08/2004, 20h48

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