Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[API WIN32] Intercepter une exception pour eviter la fermeture de l'application

8 réponses
Avatar
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).

Mon Pb :
try
{
InputMobile monTel(portCom);
Agenda monAgenda(monTel.lireMultCont("ME",1,500,trace));
std::string namefile(namefil);
namefile += ".xml";
monAgenda.toFileXml(namefile);
MessageBox(NULL, "Contacts enregistrés", "WinTel",
MB_ICONEXCLAMATION);
}
catch(Exception err)
{
MessageBox(NULL, err.toString().c_str(), "WinTel", MB_ICONERROR);
}

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?

Merci de votre reponse.

@+Fab

8 réponses

Avatar
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).

Mon Pb :
try
{
InputMobile monTel(portCom);
Agenda monAgenda(monTel.lireMultCont("ME",1,500,trace));
std::string namefile(namefil);
namefile += ".xml";
monAgenda.toFileXml(namefile);
MessageBox(NULL, "Contacts enregistrés", "WinTel",
MB_ICONEXCLAMATION);
}
catch(Exception err)
{
MessageBox(NULL, err.toString().c_str(), "WinTel",
MB_ICONERROR); }



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
Avatar
PRORIOL Fabien
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.......


@+Fab
Avatar
Arnaud Debaene
PRORIOL Fabien wrote:
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
Avatar
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
Avatar
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
Avatar
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
Avatar
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
Avatar
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