Question con sur une exception dans un constructeur

Question con sur une exception dans un constructeur - C++ - Programmation

Marsh Posté le 07-10-2010 à 22:15:22    

Bonjour,
 
Je début en C++ et j'aurais aimé savoir: si je lance une exception dans un constructeur. Je suis obligé d'utiliser un pointeur lorsque j'utilise un objet de cette classe ? Par exemple:
 

Code :
  1. Classe * pt_objet = NULL;
  2. try{
  3.      pt_objet = new Classe();
  4. }catch(const exception & ){
  5.      /* faire des trucs */
  6. }
  7. if(pt_objet)
  8.      /* faire d'autres trucs */


 
c'est bien impossible d'utiliser une référence vers un objet ou un objet comme variable ?
 
Merci d'avance,
oliparcol

Reply

Marsh Posté le 07-10-2010 à 22:15:22   

Reply

Marsh Posté le 08-10-2010 à 08:13:37    

http://www.gotw.ca/gotw/066.htm
 
Une exception ne devrait jamais sortir du constructeur mais etre traiter en son sein.

Reply

Marsh Posté le 08-10-2010 à 09:10:39    

oliparcol a écrit :

Je début en C++ et j'aurais aimé savoir: si je lance une exception dans un constructeur. Je suis obligé d'utiliser un pointeur lorsque j'utilise un objet de cette classe?

Code :
  1. Classe * pt_objet = NULL;
  2. try{
  3.      pt_objet = new Classe();
  4. }catch(const exception & ){
  5.      /* faire des trucs */
  6. }
  7. if(pt_objet)
  8.      /* faire d'autres trucs */


 
c'est bien impossible d'utiliser une référence vers un objet ou un objet comme variable?


 
Aucun probleme avec

Code :
  1. try{
  2.     Classe object;
  3.     // faire des trucs
  4. } catch(const exception & ){
  5.     // faire des choses
  6. }


 
(Quant a la reference, je ne vois pas trop quel usage tu envisages)
 

Joel F a écrit :

http://www.gotw.ca/gotw/066.htm
Une exception ne devrait jamais sortir du constructeur mais etre traiter en son sein.


 
On ne va pas etre d'accord.  C'est le seul moyen d'eviter d'avoir un etat d'erreur pour l'objet si le constructeur peut echouer.  (Et je ne me souviens pas que ce soit la conclusion de ce GOTW, et en le survolant ca n'a pas l'air d'etre le cas).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 08-10-2010 à 19:18:57    

pardon, on ne doit pas laisser leaker une exception provenant d'un truc interne, il faut l'intercepter et la traduire en exception du bon niveau.

Reply

Marsh Posté le 09-10-2010 à 19:41:14    

Joel F a écrit :

pardon, on ne doit pas laisser leaker une exception provenant d'un truc interne, il faut l'intercepter et la traduire en exception du bon niveau.


 
C'est bizarre... ce n'est pas ce qui est marqué dans plusieurs sources sur le net... sinon on fait comment pour savoir que la construction d'un objet a échoué ? Il y a toujours l'astuce d'avoir un attribut du style "bool constructionEchouee" et de vérifier la valeur de l'attribut dès qu'on applique des méthodes à l'objet mais c'est quand même bien bien lourd...

Reply

Marsh Posté le 09-10-2010 à 19:51:22    

Un Programmeur a écrit :


 
Aucun probleme avec

Code :
  1. try{
  2.     Classe object;
  3.     // faire des trucs
  4. } catch(const exception & ){
  5.     // faire des choses
  6. }


 


 
Le problème c'est que dans ce cas, l'existence de l'objet est limité au bloc try, donc on ne peut pas l'utiliser plus loins dans le programme.

Reply

Marsh Posté le 09-10-2010 à 20:07:16    

D'accord.  Mais j'ai comme l'impression que ce n'est pas le cas le plus courant où tu peux avoir une exception dans un constructeur.  Quand j'ai le cas, je fait généralement du nettoyage avant de sortir de la fonction en condition d'erreur -- assez souvent les destructeur font tout seul le nettoyage d'ailleurs -- plutôt que de continuer avec simplement un pointeur nul.  J'imagine bien quelques cas où on peut vouloir le faire, mais ils sont plutôt... exceptionnels.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 09-10-2010 à 22:43:10    

oliparcol a écrit :


C'est bizarre... ce n'est pas ce qui est marqué dans plusieurs sources sur le net... sinon on fait comment pour savoir que la construction d'un objet a échoué ? Il y a toujours l'astuce d'avoir un attribut du style "bool constructionEchouee" et de vérifier la valeur de l'attribut dès qu'on applique des méthodes à l'objet mais c'est quand même bien bien lourd...


 
J'ai lu l'article et ce que j'en retire c'est la méthode  "bool constructionEchouee"  est pas bonne, qu'on peut lancer des exceptions dans les constructeurs mais il faut toujours traiter les exceptions au bons niveaux.

Reply

Marsh Posté le 10-10-2010 à 10:09:13    

exactement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed