Exceptions et héritages

Exceptions et héritages - C++ - Programmation

Marsh Posté le 29-08-2003 à 11:28:57    

bonjour,  
 
je déclare 3 classes d'exceptions :
 

Code :
  1. class CMyException {};
  2. class CMyExceptionSpecific1 : CMyException {};
  3. class CMyExceptionSpecific2 : CMyException {};


 
puis, ensuite, dans mon code :
 

Code :
  1. try
  2. {
  3.     throw CMyExceptionSpecific1();
  4. }
  5. catch(CMyException e)
  6. {
  7.     //
  8. }


 
est-ce possibke de savoir si e est de type CMyExceptionSpecific1 ? (sans faire un catch spécial : catch(CMyExceptionSpecific1 e))
et si oui, comment doit-on faire ? rajouter une méthode donnant un type ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 29-08-2003 à 11:28:57   

Reply

Marsh Posté le 29-08-2003 à 11:35:31    

BlackGoddess a écrit :

bonjour,  
 
je déclare 3 classes d'exceptions :
 

Code :
  1. class CMyException {};
  2. class CMyExceptionSpecific1 : CMyException {};
  3. class CMyExceptionSpecific2 : CMyException {};


 
puis, ensuite, dans mon code :
 

Code :
  1. try
  2. {
  3.     throw CMyExceptionSpecific1();
  4. }
  5. catch(CMyException e)
  6. {
  7.     //
  8. }


 
est-ce possibke de savoir si e est de type CMyExceptionSpecific1 ? (sans faire un catch spécial : catch(CMyExceptionSpecific1 e))
et si oui, comment doit-on faire ? rajouter une méthode donnant un type ?


 
Qu'est ce que tu veux faire?


---------------
Le Tyran
Reply

Marsh Posté le 29-08-2003 à 11:38:17    

putain, vos meres vous ont jamais appris à attraper les expressions ? et à faire heriter de std::exception ? :o

Reply

Marsh Posté le 29-08-2003 à 11:40:55    

Taz a écrit :

putain, vos meres vous ont jamais appris à attraper les expressions ? et à faire heriter de std::exception ? :o  


 
J'avais pas remarqué effectivement, honte sur moi :whistle:


---------------
Le Tyran
Reply

Marsh Posté le 29-08-2003 à 11:42:31    

ma mère fait pas de cpp, dsl :/
comment on utilise std::exception ?
sur le cours que j'ai, ca parle juste de bad_exception.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 29-08-2003 à 11:46:14    

Code :
  1. #include <exception>
  2.   class CMyException : public std::exception {/*...*/};
  3.   class CMyExceptionSpecific1 : public CMyException {/*...*/};
  4.   class CMyExceptionSpecific2 : public CMyException {/*...*/};


 
Et tu surcharge les méthodes qui vont bien (comem what par exemple).
 

Code :
  1. try
  2.   {
  3.         throw CMyExceptionSpecific1();
  4.   }
  5.   catch(CMyException &e)//Attention on rattrape tjrs par référence
  6.   {
  7.         //
  8.   }


Message édité par LetoII le 29-08-2003 à 11:47:07

---------------
Le Tyran
Reply

Marsh Posté le 29-08-2003 à 11:47:45    

Bon si non qu'est ce que tu veux faire exactement, pkoi t'as besoin de savoir le type exacte?


---------------
Le Tyran
Reply

Marsh Posté le 29-08-2003 à 11:55:32    

et bien en fait je voudrais faire un catch général pour toutes les exceptions qui pourraient se produire dans mon tr{} : catch(CMyException &e), puis, à l'intérieur de ce catch, savoir quelle classe particulière a été lancée en exception.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 29-08-2003 à 11:57:01    

BlackGoddess a écrit :

et bien en fait je voudrais faire un catch général pour toutes les exceptions qui pourraient se produire dans mon tr{} : catch(CMyException &e), puis, à l'intérieur de ce catch, savoir quelle classe particulière a été lancée en exception.


 
Normalement t'as pas besoin de savoir, ou laors tu fais un catch spécifique ou t'as un problème de conception  [:spamafote]


---------------
Le Tyran
Reply

Marsh Posté le 29-08-2003 à 11:58:31    

je vous retrouve le messagee qui va bien
 

Citation :

ah ouais? ok, je vais vous expliquer pourquoi il est essentiel de capturer les exceptions par const référence.
 
1) pour le polymorphisme! rappelez vous que la grande majorité des exceptions sont basées tot ou tard sur une classe mère, le plus souvent au plus bas niveua sur std::exception. si vous capturez par valeur, vous risquez vraisemblablement de perdre de l'information, puis que par définition, quand on catch, on essaye de ramasser ce qu'on peut, on n'a aucune assurance sur ce qui arrive
 
2) pour empecher que l'exception génère elle meme une exception! pour cela, la plus part des fonctions membres des exceptions sont const et surtout marquer comme ne lançant pas d'exception. il faut suivre ce contrat qui est un gage de sécurité. le problème si on attrape par valeur, c'est que la copie d'un objet peut générer une exception, notemment si on est dans une situation de bad_alloc, tout peut arriver.
 
donc on doit capturer les exceptions par const référence pour des raisons d'efficacité et de sécurité. si on ne le fait pas, la gestion est bancale et posera problème tot ou tard. le 2eme point vous parait peut etre parano, pourtant il est tout aussi important que le premier.


 
http://forum.hardware.fr/forum2.ph [...] 606&cat=10

Reply

Marsh Posté le 29-08-2003 à 11:58:31   

Reply

Marsh Posté le 29-08-2003 à 12:01:42    

LetoII a écrit :


 
Normalement t'as pas besoin de savoir, ou laors tu fais un catch spécifique ou t'as un problème de conception  [:spamafote]  

ben non. plusieurs bloc catch peuvent aller (necore faut il les mettre dans un bon ordre) mais des fois ça ne suffit pas ou ne te permettra pas un traitement adéquouate (héritage multiple, souvent utilisé pour les exceptions). à ce moment là, les RTTI t'apportent des infos supplémentaires pour choisir la bonne stratégie)

Reply

Marsh Posté le 29-08-2003 à 12:09:13    

non mais ! tout a l'heure j'ai fait une recherche sur Exceptions, et il m'a rien trouvé !!!


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 29-08-2003 à 12:12:51    

pourtant Joce assure que la recherche est fonctionnelle [:joce]

Reply

Marsh Posté le 29-08-2003 à 12:47:16    

Taz a écrit :

pourtant Joce assure que la recherche est fonctionnelle [:joce]


 
C joce en même temp.  :whistle:


---------------
Le Tyran
Reply

Sujets relatifs:

Leave a Replay

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