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 :

exception dans un constructeur


Sujet :

C++

  1. #1
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut exception dans un constructeur
    Salut,

    Je programme en C++ et je suis actuellement confront� a la possibilit� de lancer une exception dans un constructeur.

    j'ai trouv� le liens suivant sur developpez.com :
    http://www.developpez.com/c/megacours/x3910.html

    seulement il y a quelque chose qui m'echappe, que retourne le new quand une exception est lanc�e ? un objet partiellement intialis� ?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    // supposons que l'Exception a ete lancee est 
    // traitee en interne comme expliquée sur le lien
    Objet* obj = new Objet();
    que vaut obj ? est-il NULL ?

    XXiemeciel

  2. #2
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut Re: exception dans un constructeur
    obj n'est pas cree. Il n'est meme pas accessible aux endroits ou tu peux
    capturer l'exception.

  3. #3
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut Re: exception dans un constructeur
    Citation Envoy� par jmarc68
    obj n'est pas cree. Il n'est meme pas accessible aux endroits ou tu peux
    capturer l'exception.
    donc obj est NULL ?

    XXiemeciel

  4. #4
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Non, obj n'est pas cree. Si tu lances une exception dans ton constructeur,
    new ne retourne rien, la propagation de l'exception continue et la ligne
    suivant ta definition n'est pas executee.

  5. #5
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Citation Envoy� par jmarc68
    Non, obj n'est pas cree. Si tu lances une exception dans ton constructeur,
    new ne retourne rien, la propagation de l'exception continue et la ligne
    suivant ta definition n'est pas executee.
    donc il faudrait encapsuler dans un try/catch l'appel a new ?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Objet * obj = NULL;
     
    try
    {
     obj = new Objet();
    }
    catch(...)
    {
    }
    j'espere que non car je ne peux pas reprendre les 8000 fichiers cpp de l'application pour rajouter un try/catch a chaque new.

    XXiemeciel

  6. #6
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356

  7. #7
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Je vais legerement detourner la question initiale

    Est ce que en cas d'erreur de mon constructeur je peut faire quelquechose pour que new retourne NULL ?

    le fait que l'exception se propage en dehors du constructeur me gene trop pour que je puisse l'utiliser.

    XXiemeciel

  8. #8
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Si tu quites ton constructeur par une exception, tu dois la recuperer quelque part, non? Si
    ca ne te plais pas, plutot que de quiter le constructeur par une exception, tu peux avoir
    un drapeau d'etat qui indique que ton objet n'est pas correctement initialise et le tester
    (un peu comme ce qui se passe pour les stream).

  9. #9
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par xxiemeciel
    Est ce que en cas d'erreur de mon constructeur je peut faire quelquechose pour que new retourne NULL ?
    l
    Non. Pense au cas

    Class obj(args...);

    Il n'y a pas d'equivalent a NULL.

  10. #10
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Merci de vos reponses,

    Je pense que puisque je ne peux pas repasser a travers tout le code pour voir a quelles endroits mon objet est utilis� et changer chaque appel a new, je vais tout simplement prevoir un comportement de l'objet speciifique aux mauvaises utilisations.

    XXiemeciel

  11. #11
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Il existe une version de new qui ne l�ve pas d'exception : new(std::nothrow). Par contre je ne sais pas si elle renvoie NULL seulement � la place de std::bad_alloc, ou si elle attrape toute exception et la transforme en NULL.

  12. #12
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Est ce que je pourrais redefinir new seulement pour mon objet ?

    XXiemeciel

  13. #13
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Loulou24
    Il existe une version de new qui ne l�ve pas d'exception : new(std::nothrow). Par contre je ne sais pas si elle renvoie NULL seulement � la place de std::bad_alloc, ou si elle attrape toute exception et la transforme en NULL.
    C'est simplement une version de new qui le lance pas de std::bad_alloc.

    Quelque chose comme
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    Foo* p = new Foo();
    Bar* q = new(std::nothrow) Bar();
    est compile comme
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    Foo* p = operator new(sizeof(Foo));
    new(p) Foo();
    Bar* p = operator new(std::nothrow, sizeof(Bar));
    new(q) Bar();
    L'exception lancee eventuellement par le constructeur a lieu alors que operator new a
    deja retourne.

  14. #14
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par xxiemeciel
    Est ce que je pourrais redefinir new seulement pour mon objet ?
    Non. Les possibilites de surcharge de new ne permettent pas ce genre de chose. Seulement
    de changer ce qui concerne l'allocation memoire.

  15. #15
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Bon dans ce cas je vais rester sur ma premiere id�e et faire un comportement special de l'objet plutot que de lancer une exception.

    Merci
    XXiemeciel

  16. #16
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    Par d�faut
    Tu ne peux pas envelopper ta construction ?
    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...

  17. #17
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    Citation Envoy� par jmarc68
    Citation Envoy� par xxiemeciel
    Est ce que je pourrais redefinir new seulement pour mon objet ?
    Non. Les possibilites de surcharge de new ne permettent pas ce genre de chose. Seulement
    de changer ce qui concerne l'allocation memoire.
    Je n'ai jamais test� de red�finir new, mais le tout premier lien donn� (http://www.developpez.com/c/megacours/x3910.html) donne ce bout de code:
    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
    17
    18
    class A
    {
    public:
        A() throw (int);
        ~A();
     
        static void *operator new(size_t taille)
        {
            cout << "new()" << endl;
            return malloc(taille);
        }
     
        static void operator delete(void *p)
        {
            cout << "delete" << endl;
            free(p);
        }
    };
    Est-ce que ca red�finit l'operateur new peu importe son contexte d'utilisation ? Et si oui, quel est l'int�r�t de le mettre comme operateur statique de la classe A ?

  18. #18
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par bigquick
    Je n'ai jamais test� de red�finir new, mais le tout premier lien donn� (http://www.developpez.com/c/megacours/x3910.html) donne ce bout de code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    definition de new et de delete en tant que membres statiques
    Est-ce que ca red�finit l'operateur new peu importe son contexte d'utilisation ? Et si oui, quel est l'int�r�t de le mettre comme operateur statique de la classe A ?
    Definir un operateur new comme membre (il est alors d'office statique, que l'on l'indique comme tel ou non) fait qu'il est utilise pour allouer des instances de lla classe et ses descendants (mais pas pour allouer autre chose dans les membres de la classe et des descendants).

    C'est donc une technique beaucoup moins brutale que de substituer l'operateur new global (qui alors s'impose a toutes les classes ne definissant pas d'operateur new membre). La definition d'un operateur new global devrait etre reserve a l'application et jamais impose par des bibliotheques.

  19. #19
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Ici ce n'est pas new le probl�me, mais le constructeur de l'objet.
    l'exception peut �tre est lev�e m�me sans new:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
        Object obj; // peut lever une exception
    }
    catch ( ... )
    {
        // et là je fais quoi ?
    }
    Si tu peux revoir la conception de la classe c'est peut �tre mieux que de bricoler new, ou alors cr�er un objet d'encapsulation ou une fonction de cr�ation comme le sugg�re Luc.

  20. #20
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par d�faut
    Allo,

    Merci pour vos reponses, mais je fais du refactoring de code et cette objet est tres utilis� dans le code je ne peux pas me permettre de le changer completement ou de modifier les appels deja existant a cette objet, il y en a beaucoup trop.

    Ca aurait �t� bien plus pratique pour moi que new retourne NULL dans le cas d'un echec du constructeur car tout les ancien appel au constructeur aurait continuer a fonctionner puique les pointeur sont test� systematiquement.

    XXiemeciel

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. R�ponses: 5
    Dernier message: 14/05/2008, 20h08
  2. Exceptions dans le constructeur
    Par disturbedID dans le forum C++
    R�ponses: 20
    Dernier message: 14/02/2008, 13h42
  3. Exception dans le constructeur
    Par olive_le_malin dans le forum C++
    R�ponses: 9
    Dernier message: 24/05/2007, 18h02
  4. R�ponses: 18
    Dernier message: 28/02/2007, 10h23
  5. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    R�ponses: 8
    Dernier message: 03/02/2004, 12h52

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