[API WIN32] Intercepter une exception pour eviter la fermeture de l'application
8 réponses
PRORIOL Fabien
Bonsoir,
En gros voila mon probleme,
Je debute dans l'API Windows, et je vien de réaliser mon premier programme
un peu plus evolué qu'un helloworld sous fenetre windows sans utiliser de
MFC (uniquement windows.h).
Quand ce code tourné sous console, il capturé bien l'exception et dans le
catch j'affiché le string contenu dans l'exception grace a un std::cout.
Depuis que j'ai passer a l'API windows, je voudrais que ce texte s'affiche
dans une MessageBox, mais malheureusement, je n'ai pas de MessageBox qui
apparait, mais directement l'appilcation qui se ferme.....
Pourquoi?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Arnaud Debaene
PRORIOL Fabien wrote:
Bonsoir,
En gros voila mon probleme, Je debute dans l'API Windows, et je vien de réaliser mon premier programme un peu plus evolué qu'un helloworld sous fenetre windows sans utiliser de MFC (uniquement windows.h).
Je suppose que Exception est levé par le constructeur d'Agenda ou bien par Agenda::toFileXml. Exact?
Est-ce qu'il y a des warnings à la compilation, et quels sont les options de compilation?
Si tu fais tourner le programme sous debugger, est-ce que tu passes dans le bloc catch à l'execution, et que vaut err dans ce cas là?
Arnaud
PRORIOL Fabien wrote:
Bonsoir,
En gros voila mon probleme,
Je debute dans l'API Windows, et je vien de réaliser mon premier
programme un peu plus evolué qu'un helloworld sous fenetre windows
sans utiliser de MFC (uniquement windows.h).
En gros voila mon probleme, Je debute dans l'API Windows, et je vien de réaliser mon premier programme un peu plus evolué qu'un helloworld sous fenetre windows sans utiliser de MFC (uniquement windows.h).
Bonsoir, Je viens juste de comprendre mon erreur (enfin comprendre est un grand mot).
catch(Exception err)
je l'ai remplacer par
catch(Exception* err)
Bizzard tout de meme que sous dos ça marcher et que sous windows c'est different, masi comme on dis, les voix de win32 sont impenetrable.......
Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider tant que l'on en sera pas plus sur ton code.
Arnaud
PRORIOL Fabien
> Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider tant
que
l'on en sera pas plus sur ton code.
Ben mon code est ce qu'il y a de plus simple, de different endroit de mon programme je lance des exceptions en cas d'erreur avec throw(new ExceptionConnectPort); Sachant que ExceptionConnectPort herite de Exception, Je recupere l'exception avec mon try catch.....
Mais je viens de comprendre mon probleme, avant je lancer mon exception en ecrivant ExceptionConnectPort a; throw(a); Alors que maintenant je lance avec new, c'est donc bien normal que je recupere un pointeur....
Merci quand même, @+Fab
> Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider tant
que
l'on en sera pas plus sur ton code.
Ben mon code est ce qu'il y a de plus simple,
de different endroit de mon programme je lance des exceptions en cas
d'erreur avec
throw(new ExceptionConnectPort);
Sachant que ExceptionConnectPort herite de Exception,
Je recupere l'exception avec mon try catch.....
Mais je viens de comprendre mon probleme,
avant je lancer mon exception en ecrivant
ExceptionConnectPort a;
throw(a);
Alors que maintenant je lance avec new, c'est donc bien normal que je
recupere un pointeur....
> Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider tant
que
l'on en sera pas plus sur ton code.
Ben mon code est ce qu'il y a de plus simple, de different endroit de mon programme je lance des exceptions en cas d'erreur avec throw(new ExceptionConnectPort); Sachant que ExceptionConnectPort herite de Exception, Je recupere l'exception avec mon try catch.....
Mais je viens de comprendre mon probleme, avant je lancer mon exception en ecrivant ExceptionConnectPort a; throw(a); Alors que maintenant je lance avec new, c'est donc bien normal que je recupere un pointeur....
Merci quand même, @+Fab
Arnaud Debaene
PRORIOL Fabien wrote:
Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider tant que l'on en sera pas plus sur ton code.
Ben mon code est ce qu'il y a de plus simple, de different endroit de mon programme je lance des exceptions en cas d'erreur avec throw(new ExceptionConnectPort); Sachant que ExceptionConnectPort herite de Exception, Je recupere l'exception avec mon try catch.....
Mais je viens de comprendre mon probleme, avant je lancer mon exception en ecrivant ExceptionConnectPort a; throw(a); Alors que maintenant je lance avec new, c'est donc bien normal que je recupere un pointeur....
Oui c'est normal. Et pour être complètement correct, tu dois faire un delete de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Arnaud
PRORIOL Fabien wrote:
Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider
tant que l'on en sera pas plus sur ton code.
Ben mon code est ce qu'il y a de plus simple,
de different endroit de mon programme je lance des exceptions en cas
d'erreur avec
throw(new ExceptionConnectPort);
Sachant que ExceptionConnectPort herite de Exception,
Je recupere l'exception avec mon try catch.....
Mais je viens de comprendre mon probleme,
avant je lancer mon exception en ecrivant
ExceptionConnectPort a;
throw(a);
Alors que maintenant je lance avec new, c'est donc bien normal que je
recupere un pointeur....
Oui c'est normal. Et pour être complètement correct, tu dois faire un delete
de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer
par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Ca n'explique rien et c'est anormal, mais on ne pourra pas t'aider tant que l'on en sera pas plus sur ton code.
Ben mon code est ce qu'il y a de plus simple, de different endroit de mon programme je lance des exceptions en cas d'erreur avec throw(new ExceptionConnectPort); Sachant que ExceptionConnectPort herite de Exception, Je recupere l'exception avec mon try catch.....
Mais je viens de comprendre mon probleme, avant je lancer mon exception en ecrivant ExceptionConnectPort a; throw(a); Alors que maintenant je lance avec new, c'est donc bien normal que je recupere un pointeur....
Oui c'est normal. Et pour être complètement correct, tu dois faire un delete de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Arnaud
PRORIOL Fabien
> Oui c'est normal. Et pour être complètement correct, tu dois faire un
delete
de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Ben en fait, je ne sait pas ;-)
Je ne savais pas ce qui était meilleur, et j'ai du voir les deux solution dans des exemples sur le net....
Pourquoi la solution par valeur est meilleur? Tant qu'a apprendre a programmer, autant apprendre correctement!!!
Merci, @+Fab
> Oui c'est normal. Et pour être complètement correct, tu dois faire un
delete
de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer
par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Ben en fait, je ne sait pas ;-)
Je ne savais pas ce qui était meilleur, et j'ai du voir les deux solution
dans des exemples sur le net....
Pourquoi la solution par valeur est meilleur?
Tant qu'a apprendre a programmer, autant apprendre correctement!!!
> Oui c'est normal. Et pour être complètement correct, tu dois faire un
delete
de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Ben en fait, je ne sait pas ;-)
Je ne savais pas ce qui était meilleur, et j'ai du voir les deux solution dans des exemples sur le net....
Pourquoi la solution par valeur est meilleur? Tant qu'a apprendre a programmer, autant apprendre correctement!!!
Merci, @+Fab
Arnaud Debaene
PRORIOL Fabien wrote:
Oui c'est normal. Et pour être complètement correct, tu dois faire un delete de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Ben en fait, je ne sait pas ;-)
Je ne savais pas ce qui était meilleur, et j'ai du voir les deux solution dans des exemples sur le net....
Probablement parce que les MFC forcent à fonctionner comme cela (je ne sais plus pourquoi). Les MFC sont rarement un modèle de programmation C++ ;-)
Pourquoi la solution par valeur est meilleur?
- Ça t'évite d'oublier de faire un delete sur l'exception. - Lorsque une exception est levée, c'est à-priori que le programme est dans un état anormal, voire instable. Dans ces conditions, on essaie de faire le minimum de choses susceptibles de compliquer encore les choses, comme par exemple une allocation dynamique.
Entre autre choses, il se passerait quoi si le système essayait de faire un new sur std::bad_alloc lorsqu'une allocation échoue parce qu'il n'y a plus de mémoire disponible? :-)
Arnaud
PRORIOL Fabien wrote:
Oui c'est normal. Et pour être complètement correct, tu dois faire
un delete de l'exception quand tu l'attrapes. Ceci-dit, il est
préférable de lancer par valeur. Pourquoi es-tu passé à une
exception lancée par pointeur?
Ben en fait, je ne sait pas ;-)
Je ne savais pas ce qui était meilleur, et j'ai du voir les deux
solution dans des exemples sur le net....
Probablement parce que les MFC forcent à fonctionner comme cela (je ne sais
plus pourquoi). Les MFC sont rarement un modèle de programmation C++ ;-)
Pourquoi la solution par valeur est meilleur?
- Ça t'évite d'oublier de faire un delete sur l'exception.
- Lorsque une exception est levée, c'est à-priori que le programme est dans
un état anormal, voire instable. Dans ces conditions, on essaie de faire le
minimum de choses susceptibles de compliquer encore les choses, comme par
exemple une allocation dynamique.
Entre autre choses, il se passerait quoi si le système essayait de faire un
new sur std::bad_alloc lorsqu'une allocation échoue parce qu'il n'y a plus
de mémoire disponible? :-)
Oui c'est normal. Et pour être complètement correct, tu dois faire un delete de l'exception quand tu l'attrapes. Ceci-dit, il est préférable de lancer par valeur. Pourquoi es-tu passé à une exception lancée par pointeur?
Ben en fait, je ne sait pas ;-)
Je ne savais pas ce qui était meilleur, et j'ai du voir les deux solution dans des exemples sur le net....
Probablement parce que les MFC forcent à fonctionner comme cela (je ne sais plus pourquoi). Les MFC sont rarement un modèle de programmation C++ ;-)
Pourquoi la solution par valeur est meilleur?
- Ça t'évite d'oublier de faire un delete sur l'exception. - Lorsque une exception est levée, c'est à-priori que le programme est dans un état anormal, voire instable. Dans ces conditions, on essaie de faire le minimum de choses susceptibles de compliquer encore les choses, comme par exemple une allocation dynamique.
Entre autre choses, il se passerait quoi si le système essayait de faire un new sur std::bad_alloc lorsqu'une allocation échoue parce qu'il n'y a plus de mémoire disponible? :-)
Arnaud
PRORIOL Fabien
> > Pourquoi la solution par valeur est meilleur? - Ça t'évite d'oublier de faire un delete sur l'exception. - Lorsque une exception est levée, c'est à-priori que le programme est
dans
un état anormal, voire instable. Dans ces conditions, on essaie de faire
le
minimum de choses susceptibles de compliquer encore les choses, comme par exemple une allocation dynamique.
Merci de tes conseil, je vais les suivre ;-)
@+Fab
> > Pourquoi la solution par valeur est meilleur?
- Ça t'évite d'oublier de faire un delete sur l'exception.
- Lorsque une exception est levée, c'est à-priori que le programme est
dans
un état anormal, voire instable. Dans ces conditions, on essaie de faire
le
minimum de choses susceptibles de compliquer encore les choses, comme par
exemple une allocation dynamique.
> > Pourquoi la solution par valeur est meilleur? - Ça t'évite d'oublier de faire un delete sur l'exception. - Lorsque une exception est levée, c'est à-priori que le programme est
dans
un état anormal, voire instable. Dans ces conditions, on essaie de faire
le
minimum de choses susceptibles de compliquer encore les choses, comme par exemple une allocation dynamique.