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 C++ Discussion :

Durée de vie d'une exception


Sujet :

Langage C++

  1. #1
    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 Durée de vie d'une exception
    Bonsoir,

    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc, char * argv [])
    {
       try
       {
          if(bla bla)
             throw std::exception("bla bla");
       }
       catch(std::exception & e)
       {
          // gestion des erreurs
       }
       return EXIT_SUCCESS;
    }
    Cela marche bien mais je me pose une question au sujet de la durée de vie de l'exception

    Dès que l'exception est levée, on quitte le bloc try et donc, normallement l'objet std::exception est détruit.

    Comment se fait t'il alors qu'il existe encore dans le bloc catch et qu'il soit valide.
    • Coup de chance
    • c'est normal et j'ai rien compris
    • autre chose

    Est ce que le mieux ce ne serait pas d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       throw new std::exception("bla bla");
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       catch(std::exception * e)
       {
          // gestion des erreurs
          delete e;
       }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Je vais peut-être dire une bêtise, mais je crois que le block try-catch en interne ne forme qu'un seul block et si une exception est levée, il y a un saut jusqu'au catch et l'exception n'est détruite qu'à la fin du block catch.

  3. #3
    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
    Citation Envoyé par ram-0000 Voir le message
    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc, char * argv [])
    {
       try
       {
          if(bla bla)
             throw std::exception("bla bla");
       }
       catch(std::exception & e)
       {
          // gestion des erreurs
       }
       return EXIT_SUCCESS;
    }
    A noter ici que la norme ne spécifie pas de constructeur de std::exception prenant une chaine de caractère. Même si cela peut compiler sur certains compilateurs le proposant en extension, ce genre de code n'est pas portable.

    Cela marche bien mais je me pose une question au sujet de la durée de vie de l'exception

    Dès que l'exception est levée, on quitte le bloc try et donc, normalement l'objet std::exception est détruit.
    Normalement, oui, et même avant de quitter le bloc vu qu'il s'agit d'un temporaire. Mais les objets créés à l'aide du mot-clé throw ont une durée de vie différente :
    Citation Envoyé par la norme
    A throw-expression initializes a temporary object [...] The memory for the temporary copy of the exception being thrown is allocated in an unspecified way [...] The temporary persists as long as there is a handler being executed for that exception.
    Est ce que le mieux ce ne serait pas d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       throw new std::exception("bla bla");
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       catch(std::exception * e)
       {
          // gestion des erreurs
          delete e;
       }
    Pas besoin de s'embêter avec l'allocation dynamique, donc

  4. #4
    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
    Il faut lever les exceptions par valeur et les attraper par référence.

    Quand tu lèves une exception, l'objet est copié dans un stockage particulier.
    Boost ftw

  5. #5
    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
    Citation Envoyé par Sylvain Togni Voir le message
    A noter ici que la norme ne spécifie pas de constructeur de std::exception prenant une chaine de caractère. Même si cela peut compiler sur certains compilateurs le proposant en extension, ce genre de code n'est pas portable.
    Je vais regarder ce détail mais effectivement, ce n'était pas le coeur du problème.

    Citation Envoyé par Sylvain Togni Voir le message
    Normalement, oui, et même avant de quitter le bloc vu qu'il s'agit d'un temporaire. Mais les objets créés à l'aide du mot-clé throw ont une durée de vie différente ::
    Citation Envoyé par la norme
    A throw-expression initializes a temporary object [...] The memory for the temporary copy of the exception being thrown is allocated in an unspecified way [...] The temporary persists as long as there is a handler being executed for that exception.
    Ceci explique cela mais j'adore quand une norme décrit un comportement global sans pour autant le spécifier !!

    Citation Envoyé par Sylvain Togni Voir le message
    Pas besoin de s'embêter avec l'allocation dynamique, donc
    Bonne nouvelle donc.

    Merci à tous
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    salut,

    Citation Envoyé par ram-0000 Voir le message
    Dès que l'exception est levée, on quitte le bloc try et donc, normallement l'objet std::exception est détruit.
    Il a bien été détruit, par contre le compilateur a fait une copie de ton objet pour permettre le traitement de l'exception par le bloc catch.
    Aussi, tu dois bien garder à l'esprit que tu dois utiliser des références et non des pointeurs, dans quel cas tu risques de te retrouver avec plusieurs copies de travail.

  7. #7
    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
    Citation Envoyé par maxim_um Voir le message
    Il a bien été détruit, par contre le compilateur a fait une copie de ton objet pour permettre le traitement de l'exception par le bloc catch.
    Aussi, tu dois bien garder à l'esprit que tu dois utiliser des références et non des pointeurs, dans quel cas tu risques de te retrouver avec plusieurs copies de travail.
    Donc si je comprends bien ce que tu dit, il faut que l'objet exception que je lève ait un constructeur de copie valide. Sinon l'objet traité dans le bloc catch risque d'être invalide.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Absolument.

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par maxim_um Voir le message
    Absolument.
    Ou pour éviter cela, tu rattrapes par référence constante et normalement, pas de copie

  10. #10
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Pourquoi tu dis:

    Citation Envoyé par Matthieu Brucher Voir le message
    normalement, pas de copie
    Tu n'en es pas sûr?

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

Discussions similaires

  1. Durée de vie d'une session
    Par khokho dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 28/06/2006, 21h31
  2. durée de vie d'une instruction
    Par poporiding dans le forum C++
    Réponses: 6
    Dernier message: 08/06/2006, 16h11
  3. Réponses: 3
    Dernier message: 27/04/2006, 11h37
  4. Durée de vie d'une session
    Par dbass dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 19h38
  5. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33

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