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 :

Gestion des exceptions


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut Gestion des exceptions
    Bonjour à tous,

    J'aimerais gérer les erreurs de mon programme à l'aide des exceptions, mais avant ça je me pose quelques questions...

    Comment peut-on savoir quelles exceptions sont susceptibles d'être levées par une instruction ? Par exemple, quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maclasse *ptr = new Maclasse();
    , je peux avoir une exception bad_alloc. Mais est-ce que ce code pourrait en lever d'autres ? Y a-t-il un endroit où je pourrais trouver la liste exhaustive des exceptions levées "en standard" et de leurs conditions de survenue (c'est mal dit, mais je pense que vous comprenez...) ?

    Faut-il toujours déclarer les exceptions qu'on laisse échapper ? Si on oublie des exceptions dans la déclaration, peut-on échapper à la fonction 'terminate()' ?

    Des exceptions peuvent être levées dans le constructeur d'une classe, mais est-ce qu'on ne pourrait pas en avoir aussi dans sa liste d'initialisation ? Est-ce qu'on ne risque pas alors des fuites de mémoire ?

    Merci pour vos éclaircissements

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Normalement, la liste d'initialisation n'est pas censée lever d'exceptions, mais dans ce cas, si effectivement l'exception est catchée hors du constructeur, tu auras une fuite de mémoire, dans la supposition où l'exception entre dans le cadre d'une fonction faisant une allocation dynamique...

    Ensuite, pour avoir la liste de exceptions levées en standard, il te faut regarder dans la doc... il n'y en a pas énormément... mais il faut être bien prudent car chaque ligne du constructeur est potentiellement génératrice d'une exception différente...

    Pour catcher toutes les exceptions standards, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch (std::exception& e) {[...]}
    et pour toutes les exceptions sans distinction (mais tu ne peux pas y faire référence Ensuite, chaque classe déclare normalement dans sa documentation les exceptions que chaque méthode est susceptible de lever....
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    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
    Par défaut
    Il suffit d'utiliser le RAII et ton code devient exception-safe.

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Ok, merci pour vos réponses !
    Je vais essayer d'utiliser correctement le RAII

    Citation Envoyé par Swoög
    Ensuite, pour avoir la liste de exceptions levées en standard, il te faut regarder dans la doc...
    La doc dont tu parles, c'est le standard ? Ou je peux les trouver ailleurs (je n'ai pas de copie du standard) ?

    Citation Envoyé par Swoög
    Ensuite, chaque classe déclare normalement dans sa documentation les exceptions que chaque méthode est susceptible de lever....
    Ca, si j'ai bien compris, c'est justement aussi ce que je dois faire dans ma bibliothèque en déclarant les exceptions que laisse échapper chaque fonction.

    Bon, ben y'a plus qu'à...

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La doc dont tu parles, c'est le standard ? Ou je peux les trouver ailleurs (je n'ai pas de copie du standard) ?
    Voir FAQ C++, pour le standard (payant) comme pour la doc de référence de la bibliothèque standard.

    Ca, si j'ai bien compris, c'est justement aussi ce que je dois faire dans ma bibliothèque en déclarant les exceptions que laisse échapper chaque fonction.
    Tout juste Auguste.

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Merci à tous... et hop, un résolu !

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Citation Envoyé par Eusebe
    a- Comment peut-on savoir quelles exceptions sont susceptibles d'être levées par une instruction ? Par exemple, quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maclasse *ptr = new Maclasse();
    , je peux avoir une exception bad_alloc. Mais est-ce que ce code pourrait en lever d'autres ?

    b- Y a-t-il un endroit où je pourrais trouver la liste exhaustive des exceptions levées "en standard" et de leurs conditions de survenue (c'est mal dit, mais je pense que vous comprenez...) ?

    c- Faut-il toujours déclarer les exceptions qu'on laisse échapper ? Si on oublie des exceptions dans la déclaration, peut-on échapper à la fonction 'terminate()' ?
    a-
    new -> bad_alloc
    constructeur -> ce que tu lêves directement ou non (niveau corps du constructeur) + ce que lêvent les constructeurs de tes attributs (niveau liste d'initialisation, explicite ou implicite)

    b- Une doc de référence ? Tu est allé voir la FAQ ?

    c- C'est un attrape couillon. En C++, les spécifications d'exception sont des assertions non débrayables. Je préfère encore me faire l'assert à la main pour avoir un core à analyser en mode débug, et donc investiguer quand une exception qui n'aurait pas du remonter remonte. Pour le release, je traduis au niveau où je suis capable d'en faire quoique ce soit.

    Autrement la liste d'initialisation peut tout à fait la source d'une exception. D'où que le RAII est notre ami (FAQ!!). En général, on évite qu'une classe soit responsable de plus d'une seule ressource brute (pourquoi se limiter à la mémoire ?). Voir l'article sur "The big law of two" référencé dans la FAQ. Il me semble que ce cas particulier soit évoqué.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par Luc Hermitte
    b- Une doc de référence ? Tu est allé voir la FAQ ?
    Oui, oui... J'ai bien pensé au standard, mais il est pas consultable directement, donc je cherchais autre chose, mais je vais me débrouiller

    Citation Envoyé par Luc Hermitte
    c- C'est un attrape couillon. En C++, les spécifications d'exception sont des assertions non débrayables. Je préfère encore me faire l'assert à la main pour avoir un core à analyser en mode débug, et donc investiguer quand une exception qui n'aurait pas du remonter remonte. Pour le release, je traduis au niveau où je suis capable d'en faire quoique ce soit.
    Donc, selon toi, si j'ai bien compris, il est préférable de décrire les exceptions remontées dans la doc que la bibliothèque plutôt que directement dans le code, avec le risque d'oublier des exceptions... c'est noté.

    Citation Envoyé par Luc Hermitte
    Autrement la liste d'initialisation peut tout à fait la source d'une exception. D'où que le RAII est notre ami (FAQ!!). En général, on évite qu'une classe soit responsable de plus d'une seule ressource brute (pourquoi se limiter à la mémoire ?). Voir l'article sur "The big law of two" référencé dans la FAQ. Il me semble que ce cas particulier soit évoqué.
    Ah ? J'ai pourtant regardé la question de la FAQ qui parlait du RAII... J'y retourne de suite

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    a- les draft suffisent.
    Mais les docs de la SL vont bien aussi. D'où la FAQ pour avoir des adresses

    c- Je ne suis pas très original là dessus. Je ne fais que suivre le mouvement.
    Avoir un programme qui plante (en core dump ou assimilé) en mode debug à cause d'un oubli, ce n'est pas grave. C'est aussi pour cela que l'on a un mode debug : analyser des core résultant d'erreurs de programmation. Avoir le programme qui plante en mode release, ça craind. Ca ne fait pas sérieux.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. [ADOConnect] gestion des exception en tout temps
    Par portu dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/04/2005, 19h01
  2. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  3. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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