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: Question initiale : pourquoi les exceptions sont-elles si peu utilisées en c++?

Votants
45. Vous ne pouvez pas participer à ce sondage.
  • méconnaissance de leur potentiel

    22 48,89%
  • gestion du code de retour d'erreur plus pratique et plus efficace

    6 13,33%
  • raison historique : mise en place tardive dans la SL

    10 22,22%
  • problème de performances

    4 8,89%
  • un peu tout ça à la fois

    4 8,89%
  • autre

    3 6,67%
  • t'as rien compris

    6 13,33%
  • ne se prononce pas

    4 8,89%
Sondage à choix multiple
C++ Discussion :

Pourquoi si peu de gens utilisent'ils les exceptions en c++?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut Pourquoi si peu de gens utilisent'ils les exceptions en c++?

    Récemment j'ai pu lire un code qui utilisait pour chaque retour de fonction un boolean supportant un code d'erreur. Bref pire que le terrible HRESULT de winerror.h.
    Après avoir dit beurk, une énième question existentielle m'a traversé l'esprit.
    Pourquoi les exceptions en c++ sont (ou me semblent) si peu utilisées ? Alors qu'en Java elles sont omniprésentes.
    Y a t'il une ou plusieurs raisons à cela quel soit technique, historique, psychologique ?

    Merci de votre éclairage.

  2. #2
    screetch
    Invité(e)
    Par défaut
    1) une raison parfois invoquée est le cout des exceptions en C++, ce n'est pas gratuit au runtime. c'est pas la raison la plus employée mais c'est celle que j'utilise donc je la mets en 1

    2) du point de vue programmation, beaucoup avancent que les exceptions ne font pas partie du flux normal d'instruction, a savoir qu'une exception est comme son nom l'indique exceptionnelle, et que c'est quelque chose qui ne devrait ps arriver dans le produit final

    3) la difficulté d'ecrire du code exception-safe est phenomenale. que se passe t'il si on interromp une operation en cours ? on est alors dans un etat ni initial, ni final, mais on revient a l'appelant de la methode. souvent, il n'y a pas de bonne echappatoire, le code va immanquablement planter.

    neanmoins les exceptions remplacent souvent avantageusement les valeurs de retour.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    1/ Je ne suis pas sur que les exceptions soient si peu utilisees que cela. C'est peut-etre vrai a certains endroits et pas a d'autres.
    2/ Perso, je trouve que certains les utilisent quand il ne faut pas; et ce genre de cas se retrouve, si j'ai bonne memoire, jusque dans la bibliotheque standard Java (exemple, jeter une exception si l'ouverture d'un fichier echoue). Et si les programmeurs Java suivent la tendance, il est possible que ce soit eux qui les utilisent trop.
    3/ Si, c'est pas clair par les deux points ci dessus: la bonne question est "Quand est-ce qu'il faut utiliser des exceptions?" Ma reponse est "Si la fonction appelante a peu de chance d'etre celle qui va gerer la condition signalee. Dans le cas de l'ouverture d'un fichier, c'est la fonction appelante qui va generalement gerer l'erreur (en essayant un autre fichier, en rapportant une erreur).

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Une autre explications, les compilateurs c++ ont tardé à implémenter la notion d'exception. Alors les développeurs ont appris le c++ sans exception et ont de la peine a y revenir.

    C'est au moins mon cas.

  5. #5
    screetch
    Invité(e)
    Par défaut
    oui mais en general on est pas son propre client. par exemple, un jeu charge la lib lua qui charge un fichier. ce n'est pas a lua de gerer le fait que le fichier n'existe pas, c'est au jeu. donc le chargement du fichier qui plante devrait lancer une exception non rattrappée par lua. sinon lua doit propager l'info que le fichier n'existe pas. si le fichier existe mais ne compile pas, lua doit renvoyer une autre information.

    la jean marc tu emets une supposition que l'utilisateur va traiter lui meme un evenement et ce n'est pas forcément le cas.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Au fait, puisque tu dis "pire", en quoi le HRESULT est-il mauvais?
    Je rappelle que tous les langages compatibles COM ne sont pas capables de gérer les exceptions...

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par screetch Voir le message
    oui mais en general on est pas son propre client. par exemple, un jeu charge la lib lua qui charge un fichier. ce n'est pas a lua de gerer le fait que le fichier n'existe pas, c'est au jeu.
    C'est un principe d'interface. Lua ne doit pas transmettre une exception a travers une interface si la fonction appelante est celle qui va generalement gerer l'exception.

  9. #9
    screetch
    Invité(e)
    Par défaut
    tu n'as pas compris ce que je voulais dire.

    une exception permet de ne pas se soucier de qui va traiter l'erreur. dans ton exemple, tu disais que pour l'ouverture d'un fichier qui echoue c'est l'appelant qui verifie et que donc il est possible de renvoyer un code d'erreur sans utiliser une exception. et je dis non, il existe des cas ou tu n'es pas le client direct de ton api d'ouverture de fichier. dans mon exemple, j'ai inseré lua; je voudrais dire qu'avec la surcouche lua, je souhaite quand meme que mon programme soit prevenu si le script n'existe pas.

    la solution actuelle etant que lua forwarde l'erreur de l'echec d'ouverture de fichier, et ca je trouve que saylemal.

    les codes d'erreur en valeur de retour c'est toujours le mal, qu'on se le dise.

  10. #10
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Au fait, puisque tu dis "pire", en quoi le HRESULT est-il mauvais?
    Je rappelle que tous les langages compatibles COM ne sont pas capables de gérer les exceptions...
    Pour traiter le HRESULT on voit souvent un gros switch bien crade pour le comparer avec les constantes du winerror.h. Sachant qu'y en a plus de 1000 ! On voit vite qu'on peut arriver à des cas extrêmes.

    Mais il est vrai que dans les langages ne gérant pas les exceptions cela peut s'avérer utile.



    @Montgaulois: merci pour le thread. J'avais pas mis les bons mot-clés

    Pour rappel ce lien riche d'enseignement : http://www.parashift.com/c++-faq-lit...html#faq-17.12

  11. #11
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Une autre explications, les compilateurs c++ ont tardé à implémenter la notion d'exception. Alors les développeurs ont appris le c++ sans exception et ont de la peine a y revenir.

    C'est au moins mon cas.
    C'est aussi mon avis

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Pour traiter le HRESULT on voit souvent un gros switch bien crade pour le comparer avec les constantes du winerror.h. Sachant qu'y en a plus de 1000 ! On voit vite qu'on peut arriver à des cas extrêmes.
    En effet, c'est complètement contraire à la spécification de COM qui dit de traiter uniquement les codes pertinents, et considérer les autres comme E_UNEXPECTED.
    Mais il est vrai que dans les langages ne gérant pas les exceptions cela peut s'avérer utile.
    En fait, c'est encore plus utile pour les langages qui supportent les exceptions, sauf C++: Le HRESULT est traduit en exception et normalement, vice versa.

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    (relativement aux points soulevés par screetch)

    2) Je ne suis pas d'accord avec la vision des "beaucoup" auxquels tu fais référence.
    Pour moi elles servent à traiter les situations non nominales. Une rupture réseau est parfaitement possible dans un produit final. Une exception est parfaite en ce qui me concerne dans ce genre de situations. Et effectivement, pour faire remonter le problème à l'endroit qui va bien.

    Un truc qui n'est jamais sensé se produire, si cela se produit, c'est que les algos/le code sont faux. Là, c'est le boulot des assertions en ce qui me concerne. On peut les doubler d'exceptions pour faire moins "laid" sur le produit en release, mais bon. C'est pas leur rôle premier. (d'ailleurs, ils n'ont pas une dualité à ce sujet en Java avec les checked et unchecked exceptions?)

    Une exception sur un fichier qui ne peut être ouvert ne me choque pas. Si lors d'un traitement complexe comme un rejeu fichier de télémétrie archivée je ne peux ouvrir le fichier, je pête une exception que je traiterai à l'endroit qui va bien. Par contre, si je ne peux logger ce qui circule sur mes réseaux, tanpis j'ignore, c'est aux admins de nétoyer les disques. Tout dépend de ce qui doit être fait.


    3) Je ne trouve pas qu'un code spaghetti (ou bourré de "if (pasbon) goto ERROR:;") soit plus simple à rendre atomique/leak-free qu'un code qui repose sur les exceptions. AMHA, c'est limite le contraire, le RAII aidant beaucoup.


    Quant à moi je vois:
    a- l'aspect psychologique ("on n'a pas appris avec", "c'est lent", ...) déjà soulevé
    b- la difficulté inhérente à un domaine difficile et mal compris (ce qui renvoie en a-) -- les codes que je vois sont avant tout pensés en situation nominale. On retombe sur le point de la difficulté à traiter les cas non nominaux. Mais exception ou code de retour, cela ne change rien : les gens ne savent pas traiter ces situations. Souvent, c'est l'expérience liée au métier qui permet d'avoir une indication de comment les traiter (et quoi traiter) ; l'expérience développement/C++ enseignant comment mettre en oeuvre la gestion de ces cas non nominaux.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Je pense aussi que c'est le manque d'expérience générale avec les exceptions qui prime. D'ailleurs, beaucoup d'autres arguments en découlent. Mais les exceptions ont aussi le désagréable avantage de rendre très visible la difficulté de la gestion d'erreurs. Du coup, on voit souvent tirer sur le messager...

    Carl

  15. #15
    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 : 50
    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
    Citation Envoyé par screetch Voir le message
    une exception permet de ne pas se soucier de qui va traiter l'erreur. dans ton exemple, tu disais que pour l'ouverture d'un fichier qui echoue c'est l'appelant qui verifie et que donc il est possible de renvoyer un code d'erreur sans utiliser une exception. et je dis non, il existe des cas ou tu n'es pas le client direct de ton api d'ouverture de fichier. dans mon exemple, j'ai inseré lua; je voudrais dire qu'avec la surcouche lua, je souhaite quand meme que mon programme soit prevenu si le script n'existe pas.
    Je dirais qu'il y a deux cas. Si la fonction appelée par l'utilisateur de lua n'a aucun rapport avec l'ouverture de fichier, il ne me semble pas choquant qu'une exception soit émise si l'ouverture échoue. Si c'est une fonction ouvrant un fichier, il sera plus simple que cette fonction ait un code de retour. Dans les deux cas, la façon dont lua reportera cette erreur dépend de l'interface de lua et de rien d'autre.

    En interne à lua, l'erreur détectée par code de retour de la fonction bas niveau d'ouverture de fichier pourra être transmise sous forme d'exception ou par passage de retour de fonction dans les deux cas, ça dépend uniquement de l'épaisseur de la couche lua, pas de ce que sera au final son interface.

    Et même si elle est transmise en interne de lua sous forme d'exception, et qu'on a décidé que l'interface de lua va générer une exception, il y a de fortes chances que ce ne soit pas la même exception, mais une exception indiquant le problème avec une sémantique au niveau de l'interface lua, pas au niveau de son implémentation (et éventuellement une donnée membre innerException qui reprend l'exception initiale).

    Citation Envoyé par screetch Voir le message
    les codes d'erreur en valeur de retour c'est toujours le mal, qu'on se le dise.
    Les prises de décisions absolues et dogmatiques sur un sujet technique, c'est le Mal incarné.

  16. #16
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    En interne à lua, l'erreur détectée par code de retour de la fonction bas niveau d'ouverture de fichier pourra être transmise sous forme d'exception ou par passage de retour de fonction dans les deux cas, ça dépend uniquement de l'épaisseur de la couche lua, pas de ce que sera au final son interface.
    ce n'est pas au concepteur d'une bilbiotheque de decider si c'est la premiere couche, la deuxieme ou la 42eme qui doit gérer le fichier non existant. de mon point de vue, une exception permet de laisser le vrai "gerant" de l'erreur s'en occupper, alors qu'un code de retour d'erreur doit etre géré immediatement.

    une exception PEUT egalement etre gérée immediatement.

    tout ce qui sert ici a expliquer pourquoi un code de retour d'erreur n'est pas si mal se base sur des suppositions sur l'appelant. c'est pas comme ca qu'on encapsule du code, il me semble.

  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Rien n'empêche l'appelant à lancer une exception si la fonction lui renvoi un code d'erreur qu'il ne sait pas gérer à son niveau.

    Je n'ai pas cette vision qu'en C++ les exceptions son LA façon de gérer les erreurs. Elles conviennent à certaines situations, pas à d'autres.

    Dans l'interface d'une bibliothèque, par exemple, j'ai l'impression qu'elles sont rarement la meilleure solution.

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    3) la difficulté d'ecrire du code exception-safe est phenomenale. que se passe t'il si on interromp une operation en cours ? on est alors dans un etat ni initial, ni final, mais on revient a l'appelant de la methode. souvent, il n'y a pas de bonne echappatoire, le code va immanquablement planter.
    C'est exactement la même difficulté qu'avec les valeurs de retour, sauf qu'avec les exceptions cela peut s'automatiser et se programmer plus élégamment et de manière plus performante.
    À noter, néanmoins, que les outils d'analyse statique se débrouillent mieux avec des if dans tous les sens qu'avec des exceptions.

  19. #19
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Rien n'empêche l'appelant à lancer une exception si la fonction lui renvoi un code d'erreur qu'il ne sait pas gérer à son niveau.
    je pense que si j'avais dit "rien n'empeche l'appelant de capturer l'exception et de la transformer en code d'erreur" tout le monde m'aurait ecartelé sur la place piblique. je me demande pourquoi ca serait plus valable de faire ca.

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par screetch Voir le message
    tout ce qui sert ici a expliquer pourquoi un code de retour d'erreur n'est pas si mal se base sur des suppositions sur l'appelant. c'est pas comme ca qu'on encapsule du code, il me semble.
    Toute conception d'interface se base sur des hypotheses sur la maniere dont elle sera utilisee. Je ne vois donc pas de problemes a choisir ma gestion d'erreur sur base de ces memes hypotheses.

    J'ai utilise des interfaces qui utilisaient un autre mecanisme que des exceptions quand les exceptions auraient mieux convenus, c'est infernal. J'ai utilise des interfaces qui jetaient des exceptions quand un autre mecanisme aurait mieux convenu. C'est tout aussi infernal. A chaque fois, c'est des interfaces pas adaptees a l'usage que j'en faisais et donc mal concues pour cet usage.

Discussions similaires

  1. Pourquoi peu de gens sont sur Linux ?
    Par playerss dans le forum Linux
    Réponses: 11
    Dernier message: 26/12/2011, 17h04
  2. Réponses: 22
    Dernier message: 29/12/2010, 09h44
  3. Utiliser les exceptions pour un traitement particulier ?
    Par Blustuff dans le forum Assembleur
    Réponses: 11
    Dernier message: 01/12/2004, 02h21
  4. Quel format de fichier utiliser pour les maps ?
    Par fb57 dans le forum OpenGL
    Réponses: 3
    Dernier message: 23/09/2004, 20h22
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

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