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 :

Lancer une "autre" exception dans un constructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut Lancer une "autre" exception dans un constructeur
    Bonjour, j'aimerais savoir si il est possible (et pas trop sale ) de lancer une exception d'un autre type lors de la capture d'une exception dans la construction d'un objet membre de la classe. Normalement l'exception est relancée automatiquement à la fin du catch, alors est-ce légal d'en lancer une autre ? (rien ne semble l'interdire, mais j'ai un doute)
    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
     // Exemple
    class TMaClasse
    {
    private:
       CComObject m_ComObject;
    public:   
       TMaClasse( )
         try : m_ComObject
       {
           //...
       }
       catch( const _com_error & e )
       {
           throw EComError(e);
       }
    };
    d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par gb_68 Voir le message
    Normalement l'exception est relancée automatiquement à la fin du catch
    Ah ?
    C'est une particularité pour les try/catch englobant les constructeurs?

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    L'exception n'est pas relancé à la fin du catch même dans le constructeur. L'exception est relancé seulement si elle n'as pas encore été attrappé.

    Si tu veux lancer une autre exception, rien ne t'y empêche.

    Pourrais tu m'expliquer ce que fait le code suivant ?
    try : m_ComObject

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Salut,

    Citation Envoyé par Médinoc Voir le message
    Ah ?
    C'est une particularité pour les try/catch englobant les constructeurs?
    C'est ce qui est expliqué dans le cours de C++ de developpez.com

    Concernant la question originale, je ne sais pas répondre hélas. En tout cas je n'ai jamais eu à le faire. J'imagine que c'est autorisé, faute de quoi il nous manquerait un outil pour préciser les causes des exceptions dans certains cas, mais je ne peux hélas pas l'affirmer.

    As-tu essayé ? Est-ce que le compilateur te plante ou te warne ?

    Je suis bien curieux de savoir quel modèle de donnée te fait te poser cette question.

    Bonne journée.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ah ?
    C'est une particularité pour les try/catch englobant les constructeurs?
    Oui c'est spécial aux "function try blocks" pour les constructeurs (et les destructeurs aha !).
    (edit : cf. 15.3.16 dans le standard)

    Sinon oui on peut traduire une exception en une autre exception dans le "function try block" d'un constructeur, c'est même le seul cas d'utilisation qui a un peu un intérêt pour cette fonctionnalité (avec des effets de bord style logging tout ça mais bon)...

    MAT.

  6. #6
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Merci pour toutes ces réponses .
    C'est vrai que ce n'est pas un cas souvent rencontré, mais il est nécessaire qu'une exception soit relancée car en cas d'échec de construction d'un de ses membre (ou aussi d'une classe héritée), l'objet ne peut plus être construit du tout.
    Ce genre de code fonctionne sous VS 2005 (avec les parenthèses manquantes ) ; j'avais juste une appréhension concernant le mécanisme de relance automatique d'exception qui aurait pu interdire ou perturber la lancé d'une autre exception (en fait si cela ce passe comme une sorte de "throw;" implicite en fin de bloc il n'y a pas de problème, mais je n'en étais pas sûr).
    Dans mon cas, le but serait de ne pas propager une exception _com_error (copyright Microsoft) qui forcément n'hérite pas (recopyright Microsoft ) de std::exception (au contraire de EComError que j'ai créer justement pour ça).
    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
     // Exemple
    class TMaClasse
    {
    private:
       CComObject m_ComObject;
    public:   
       TMaClasse( )
         try : m_ComObject() // <-- oups il faut les ()
       {
           //...
       }
       catch( const _com_error & e )
       {
           throw EComError(e);
       }
    };
    Je vais tacher d'utiliser avec soins cette écriture .

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

Discussions similaires

  1. [AC-2007] lancer une requete avec 2 parametres dans Access 2007 avec VBA
    Par dimis dans le forum VBA Access
    Réponses: 8
    Dernier message: 29/07/2009, 14h45
  2. Réponses: 2
    Dernier message: 30/01/2009, 11h19
  3. Réponses: 2
    Dernier message: 22/01/2007, 20h06

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