Exceptions

Exceptions - C++ - Programmation

Marsh Posté le 18-07-2003 à 17:10:50    

Bonjour,
 
J'ai un bout de code entouré d'un try - catch.
 
Dans les catch j'intercepte toutes les exception dont je sais qu'elles peuvent etre lancé par mon bout de code.
 
Mon probleme est qu'aucune de ces exceptions n'est lancée donc j'ai du rater qque chose.
 
Mon dernier catch est un catch generique catch(...) {}
Dan ce type de catch, y a t'il moyen de recuperer la moindre info sur l'exception lancée ?
 
Merci

Reply

Marsh Posté le 18-07-2003 à 17:10:50   

Reply

Marsh Posté le 21-07-2003 à 09:36:46    

Heu, si y a pas d'exception de lancé c'est à priori que tous c'est bien passé, enfin en général c comme ça  :whistle:


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

Marsh Posté le 21-07-2003 à 14:25:58    

Si je comprend bien ton programme, tu as fait un truc dans le genre :

Code :
  1. try
  2. {
  3. try
  4. {
  5. // partie de code pouvant déclencher une exception
  6. // de type "MonException" ou "MonException2"
  7. }
  8. catch( const MonException& e )
  9. {
  10. // traitement de l'exception
  11. }
  12. catch( const MonException2& e )
  13. {
  14. // traitement de l'exception
  15. }
  16. }
  17. catch(...)
  18. {
  19. // catch générique
  20. }


 
Or ton programme detecte aucune exception "MonException" ou "MonException2" mais par contre rentre dans le catch générique, c'est ça ?
 
Premièrement, je ne crois pas que tu puisse "normalement" récupérer des infos sur l'exception dans un catch générique. Par contre, l'exception doit tout de même se retrouver quelque part (sur la pile, dans un registre...), donc tu dois pouvoir la récupérer de cette façon (juste pour debugger évidemment). Par exemple, je sais qu'en cas d'exception non gérée, Visual C++ t'affiche une boîte de dialogue avec le type de l'exception ("Unhandled exception..." ).
Sinon, le mieux est encore de vérifier dans le code le type d'exception pouvant être générées et, si besoin, de le demander aux développeurs des bibliothèques que tu utilises.
 
-- Edit --
Correction apportée au code suite à la remarque de ++Taz


Message édité par gatorette le 21-07-2003 à 15:12:03

---------------
each day I don't die is cheating
Reply

Marsh Posté le 21-07-2003 à 15:12:27    

Corrections faites...


---------------
each day I don't die is cheating
Reply

Marsh Posté le 21-07-2003 à 15:22:39    

++Taz a écrit :

personne vous a jamais appris qu'on capture toujours les exceptions par référence?


 
Et personne t'as apris à être aimmable?


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

Marsh Posté le 21-07-2003 à 15:28:10    

++Taz a écrit :

ben à toi d'expliquer pourquoi il faut des références puis que mon intervention te plait pas


 
La remarque est judicieuse, c la forme qui laisse à désirer. [:spamafote]


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

Marsh Posté le 21-07-2003 à 15:36:20    

++Taz a écrit :

et moi j'attends ton explication


 
Et moi je m'en cogne. Si t'as envie de donné plus de détail je t'en prie, je voulais juste te faire remarqué que tu pouvais utiliser un ton plus courtoi. Il est pas  nécessaire d'agrésser les gens même quand ils font un erreur.


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

Marsh Posté le 21-07-2003 à 15:47:15    

++Taz a écrit :

donc en quelques sortes, 'on t'as jamais appris pourquoi il faut toujours capturer les exceptions par référence' CQFD


 
 :sarcastic:  
 
Et honétement: même si j'ai une vague idée du pkoi et du par ce que, je m'en cogne.


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

Marsh Posté le 21-07-2003 à 15:50:27    

++Taz a écrit :

donc en quelques sortes, 'on t'as jamais appris pourquoi il faut toujours capturer les exceptions par référence' CQFD


Et t'as demontré quoi? Que tu savais plus de choses? Super, content pour toi...Ca te donne le droit d'être aussi désagréable? :sarcastic:

Reply

Marsh Posté le 21-07-2003 à 15:56:11    

++Taz a écrit :

vas y explique...  
 
edit: je comprends pas pourquoi tu t'en cognes?


Par ce que je vois pas en quoi ça fait avancer le chmilblick, ok c mieux de récupérer par reférence, vraissemblblement par ce que ça évite de surcharger la pile, de passer par les mécanisme de recopie pas forcément léger suivant les objets (encore qu'on va pas mettre des tones de truc dans une exception) et sans doute pour d'autres raisons auquelle j'ai pas pensé 1) par ce que j'ai autre chose à faire 2) ça ne revet pas un intéret fénoménal à mes yeux. Ouai super on est vachement contant maintenent.
 
Ca change pas que tu pourais être plus aimable avec les gens quand tu leur fait remarqué qu'ils ontcomis une erreur  [:spamafote]
 
Edit on peut rajouter aux considérations précédentes le fait que ça permet un transtipage eventuel de classes filles vers une même classe mère.


Message édité par LetoII le 21-07-2003 à 16:17:34

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

Marsh Posté le 21-07-2003 à 15:56:11   

Reply

Marsh Posté le 21-07-2003 à 16:00:08    

Je ne suis pas sûr que ce débat apporte grand chose au sujet...
 
Pour répondre à ++Taz : Non, désolé, on ne m'a jamais appris qu'il fallait capturer les exceptions par référence. A vrai dire, on ne m'a jamais appris à utiliser les exceptions. Pourtant, je les utilise dans mes programmes et je les capture par const-référence dans mes programmes parce que ça fonctionne et que je "sens" que c'est mieux (pas de recopie de l'exception). Quand j'ai écris le code, je me suis posé la question de mettre le petit '&' qui te pose tant de problèmes mais, n'étant pas sûr de moi, j'ai choisi de ne pas le mettre (à tort). Je suis heureux d'apprendre que ce que je faisais par "instinct" était bien.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 21-07-2003 à 16:04:15    

gatorette a écrit :

Je ne suis pas sûr que ce débat apporte grand chose au sujet...
 
Pour répondre à ++Taz : Non, désolé, on ne m'a jamais appris qu'il fallait capturer les exceptions par référence. A vrai dire, on ne m'a jamais appris à utiliser les exceptions. Pourtant, je les utilise dans mes programmes et je les capture par const-référence dans mes programmes parce que ça fonctionne et que je "sens" que c'est mieux (pas de recopie de l'exception). Quand j'ai écris le code, je me suis posé la question de mettre le petit '&' qui te pose tant de problèmes mais, n'étant pas sûr de moi, j'ai choisi de ne pas le mettre (à tort). Je suis heureux d'apprendre que ce que je faisais par "instinct" était bien.


 [:plusun]


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

Marsh Posté le 21-07-2003 à 16:29:30    

++Taz a écrit :

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.


 
Et on est vachement avancé avec ça  :wahoo:


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

Marsh Posté le 21-07-2003 à 16:33:50    

++Taz a écrit :

ecoute, si ce topic ne t'interesse pas et que les exceptions tu t'en fous, autant pas venir.


 
Ben justement, je vois aps en quoi ton explication fait avancé le pb mais bon ça doit venir de moi, en même temps j'ai pas beaucoup dormi je dois plus avoir les yeux en face des trous.


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

Marsh Posté le 21-07-2003 à 16:43:50    

++Taz a écrit :

je corrigeais gatorette et je justifie.
 
par contre mon vrai conseil: le catch(...) j'aime pas trop, on ramasse vraiment tout.


C un peu le but de la chose en même temps :D

++Taz a écrit :


si c'est un try au niveau fonctionnel sur le main, ça va, sinon, ça revient à faire l'autruche. ...


 
Je vois pas trop ou tu veux en venir, tu pourais développer un peu?


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

Marsh Posté le 21-07-2003 à 16:48:43    

++Taz a écrit :

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.


 
 :jap:
Merci pour cette information qui aurait évité bien des discussions si elle était venue plus tôt.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 21-07-2003 à 16:51:54    

++Taz a écrit :

ben au coeur de ton programme, ça te sert à quoi de catch(...) ?


 
En général à savoir qi y a une merde qq non prévu initialement et à agir en conséquence, par exemple sarréter le traitement, réessayer, envoyer un mail d'insulte chez le dévellopeur, gérer les erreurs quoi... En même temps je sent qu'on parle de la même chose sans arriver à se comprendre.


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

Marsh Posté le 21-07-2003 à 18:00:47    

++Taz a écrit :

et tu m'expliques comment reprendre le traitement puisque finalement un catch(...) c'est attrapé une exception inattendue... le coup du mail d'insulte, c'est ce dont je te parler avec un try fonctionnel au niveau du main. tu rattrapes tout ce que qui est pas géré, joli message d'erreur et le programme se termine proprement...


 
Tout dépend du module où se produit l'exception, de la structure de l'appli peut y avoir moyen de ratrapper la chose pour ne pas en arriver à l'arrét pur et simple du prog.


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

Marsh Posté le 21-07-2003 à 22:46:22    

++Taz a écrit :

et tu fais quoi si tu ramasses un bad_alloc sans le savoir?


 
Heu là celle là vaut mieux la chopper effectivement :D
 
Mais bon je crois pas qu'on puisse réellement définir une politique général de gestion des erreurs, c typiquement un truc à régler au cas par cas selon l'appli dévellopée  [:spamafote]  
 
Bon et le code qui lance pas d'xception là, il arrive?  :whistle:


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

Sujets relatifs:

Leave a Replay

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