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 �clair�
    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 : 41
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 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 chevronn�
    Inscrit en
    Novembre 2006
    Messages
    362
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    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 Expert

    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
    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 �clair�
    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 : 41
    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
    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