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 ou tests ?


Sujet :

C++

  1. #1
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut Exceptions ou tests ?
    Bonjour à tous,
    j'aimerais savoir quand utiliser les exceptions.

    Par exemple, je me demande si lorsque je demande à un utilisateur de rentrer un nom de fichier pour le lire, et que celui-ci se trompe dans le nom du fichier si je dois utiliser une exception ou plutôt faire un test juste après.
    Autre exemple, si je demande un nombre à un utilisateur pour qu'il divise un autre nombre. S'il rentre 0, je fais juste un test ou je fais une exception ?

    Plus généralement, j'aimerais comprendre pourquoi je dois utiliser un test plutôt qu'une exception et vice-versa.

    Merci d'avance.

    b Oo
    b Oo

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 87
    Points : 63
    Points
    63
    Par défaut
    Les exceptions sont a choisir en priorite lorsque votre code est destinne a etre utilise par d'autres programmeurs. Cela va d'une part permettre d'eviter les mauvaises surprises, et surtout cela va aussi permettre au programmeur 'client' de pouvoir gerrer l'erreur de la facon dont il le souhaite.

    Il est bien plus propre de gerrer les comportements inatendus (dont login/pass mauvais) par des exceptions, seulement vous pouvez faire des code tout aussi propres sans exception pour votre cas d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    couple_id_pass  identifiants
    bool            validite = false
     
    FAIRE
      identifiants = demander_login_pass;
      validite = identifiants_valides (identifiants) ?
    TANT QUE validite == FALSE
    en ajoutant un compteur pour eviter la boucle infinie et pourquoi pas un timer pour eviter les brute forces, etc ^^
    Busy 999

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 87
    Points : 63
    Points
    63
    Par défaut
    Tient je ne sais pas pourquoi je suis partis dans ce trip de login/mot de passe, j'etais persuade ca faisait parti de votre question Ce n'est pas grave, l'exemple et les explications restent valables
    Busy 999

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Faire des exceptions permet de bien séparer code et traitement des erreurs.
    Ceci évite d'alourdir des parties de code avec des if(...) à la chaîne.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Merci pour les réponses,
    Citation Envoyé par busy999
    Les exceptions sont a choisir en priorité lorsque votre code est destinne a etre utilise par d'autres programmeurs.
    Donc si mon programme n'est que "exécutable" les exceptions devraient être rarement utilisées, ou vous voulez dire que je pourrais m'en passer mais que cela n'est pas recommandé ?

    Citation Envoyé par seriousme
    Faire des exceptions permet de bien séparer code et traitement des erreurs.
    Pour cela on est d'accord, et je dirais que si l'on veut changer comment l'on rattrape l'exception cela est plus simple.

    Le problème c'est que j'ai l'impression que les exceptions sont assez "lourdes". J'entends par là que pour moi c'est comme si on envoyait un char d'assaut pour tuer une fourmi.

    Citation Envoyé par seriousme
    Ceci évite d'alourdir des parties de code avec des if(...) à la chaîne.
    Ok d'accord, mais il ne vaut pas mieux contrôler ce que rentre l'utilisateur (et donc passer à mes classes des paramètres valides qui empêche des exceptions) plutôt que de ne rien contrôler et laisser déclencher une exception ?

    En fait je n'arrive pas à très bien distinguer où les exceptions sont nécessaires ou non.

    Par exemple si je fais une classe string, il vaut mieux que mon programme génère une exception si je suis en dehors des limites du tableau, ou un test me suffit ?

    b Oo
    b Oo

  6. #6
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Par exemple si je fais une classe string, il vaut mieux que mon programme génère une exception si je suis en dehors des limites du tableau, ou un test me suffit ?
    Ici, je dirais une exception car afficher un message d'erreur est basique. On ne peut pas faire d'autre traitement contrairement à une exception.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le but d'une exception est de propager l'erreur en remontant la pile des appels. Si on peut traiter l'erreur localement, une exception ne sert à rien. Si on ne le peut pas, on utilise les exceptions.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Bonjour,
    merci à tous pour les réponses, je vais m'en tenir a JolyLoic.

    Bonne journée.

    b Oo
    b Oo

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    J'ai essayé de trouver une réponse à cette question moi aussi il y a un certain temps. Le départ de ma réflexion était un très bon blog (que je ne retrouve malheureusement pas ) avec d'excellents commentaires/débats/liens vers d'autres articles. Le sujet du blog proposait de réfléchir autour d'un exemple de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // exception en code de retour
    std::exception Test1()
    {
        return std::exception( "erreur" );
    }
     
    // code d'erreur comme exception
    void Test2()
    {
        int error_code = 51;
        throw error_code;
    }
    Pour résumer, la question à te poser est "qui peut réagir à cette erreur, qui peut la traiter et faire en sorte de la corriger ?"
    Si c'est l'appelant, alors un code de retour est préférable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    File file;
    if ( !file.open( "toto.txt" ) )
    {
        // oups
    }
    bien plus pratique que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    File file;
    try
    {
        file.open( "toto.txt" );
    }
    catch ( const FileNotFoundException & e )
    {
        // oups
    }
    les exceptions c'est juste un moyen de transport d'erreur. C'est pratique pour laisser remonter des erreurs à priori délicates et rares (mémoire insuffidante) jusqu'à quelqu'un qui s'est déclaré comme apte à les traiter via un catch "moi je sais réagir à un manque de mémoire".
    Mais exception ou code de retour, ce ne te dispense pas de te poser les questions "à qui s'adresse cette erreur ? Comment peut-il la corriger ?" : ça guide tes choix
    Voilà ce que j'avais compris.

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Les exceptions sont là aussi pour les erreurs "fatales" qui empêchent de continuer le programme en "s'arrangeant" localement avec des "if", et qui obligent l'interruption du traitement en cours.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 08/01/2013, 22h36
  2. exception au test de connection
    Par WebMeli dans le forum Visual Studio
    Réponses: 0
    Dernier message: 24/03/2011, 07h29
  3. [JUnit] Tests Junit avec exceptions
    Par alex2746 dans le forum Tests et Performance
    Réponses: 8
    Dernier message: 07/06/2010, 22h41
  4. exception lors de l'exécution d'un test d'application
    Par caro_caro dans le forum SWT/JFace
    Réponses: 6
    Dernier message: 10/12/2008, 12h47
  5. load test et webtest exception
    Par ddoc dans le forum C#
    Réponses: 0
    Dernier message: 30/08/2007, 12h06

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