Recuperation de toutes les erreurs d'execution.

Le
Ben
Voila, je cherche a creer un programme capable de capturer toutes les
erreurs possibles d'execution (division par 0, mauvais pointeur, ) et
d'afficher un message detaillant precisement l'erreur.

pour cela j'ai pense a quelque chose comme ca :
try{
instructions;
}
catch()
{
printf("Erreur");
}

J'arrive belle et bien a capturer toutes les erreurs grace au catch()
mais l'ennuie est que je n'ai aucun moyen de savoir ce qui s'est passe et
d'afficher un message plus detaille que "Erreur". J'aimerai avoir une
description de l'erreur mais comment cela est possible?
Merci.

  • Partager ce contenu :
Vos réponses Page 1 / 2
Trier par : date / pertinence
Vincent Richard
Le #105264

Voila, je cherche a creer un programme capable de capturer toutes les
erreurs possibles d'execution (division par 0, mauvais pointeur, ...) et
d'afficher un message detaillant precisement l'erreur.


Je ne crois pas qu'il soit possible de détecter ce type d'erreur en C++
standard.

Par contre, tu peux implémenter une méthode spécifique à ton OS. Par
exemple, sous GNU/Linux (ou tout autre OS POSIX), tu peux "attraper" les
signaux correspondants (notamment SIGSEGV pour "mauvais pointeur").
Sous Windows, il doit exister une méthode analogue.

Tu peux déjà attraper toutes les erreurs "standards" (générées par la
bibliothèque standard) en utilisant un "catch (std::exception& e)", la
description est dans "e.what()".

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in
Ben
Le #105263
Oui mais je ne pense pas qu'avec cette solution je sois capable de detecter
les erreurs innatendues du type division par 0 ou autres.

"Frédéri MIAILLE" news:biiacj$pb1$

"Ben" news:3f4c7e4a$0$16530$
Voila, je cherche a creer un programme capable de capturer toutes les
erreurs possibles d'execution (division par 0, mauvais pointeur, ...) et
d'afficher un message detaillant precisement l'erreur.

pour cela j'ai pense a quelque chose comme ca :
try{
instructions;
}
catch(...)
{
printf("Erreurn");
}
try{

// ... instructions;
if(Cafoire)
{
MaStuctureDerreur Diantre;
Diantre.Str="Une merde s'est produite et là, on constate que
CaFoire

est vrai.";
Diantre.Ligne=__LINE__;
Diantre.Heure=MonHeure;
Diantre.CodeErreurT768742486784541511250054870578;
}
throw Diantre;
}
catch(MaStuctureDerreur &CaTombeIci)
{
printf("%s, %s, %d, %s, %dn", CaTombeIci.Str, CaTombeIci.Ligne,
CaTombeIci.Heure, CaTombeIci.CodeErreur);
}



J'arrive belle et bien a capturer toutes les erreurs grace au catch(...)
mais l'ennuie est que je n'ai aucun moyen de savoir ce qui s'est passe
et


d'afficher un message plus detaille que "Erreur". J'aimerai avoir une
description de l'erreur mais comment cela est possible?
Merci.

En gros, pour avoir plus de descriptions.... il faut se démerder. Et je

trouve ça pas mal, ça donne un bon contrôle sur le programme.


--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.os.ms-windows.programmation
fr.comp.graphisme.programmation





Ben
Le #105262
J'utilise vc++ et "catch (std::exception& e)" ne semble pas possible (je ne
peux pas compiler).

"Vincent Richard" message news:3f4caa86$0$260$

Voila, je cherche a creer un programme capable de capturer toutes les
erreurs possibles d'execution (division par 0, mauvais pointeur, ...) et
d'afficher un message detaillant precisement l'erreur.


Je ne crois pas qu'il soit possible de détecter ce type d'erreur en C++
standard.

Par contre, tu peux implémenter une méthode spécifique à ton OS. Par
exemple, sous GNU/Linux (ou tout autre OS POSIX), tu peux "attraper" les
signaux correspondants (notamment SIGSEGV pour "mauvais pointeur").
Sous Windows, il doit exister une méthode analogue.

Tu peux déjà attraper toutes les erreurs "standards" (générées par la
bibliothèque standard) en utilisant un "catch (std::exception& e)", la
description est dans "e.what()".

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in


Vincent Richard
Le #105261

J'utilise vc++ et "catch (std::exception& e)" ne semble pas possible (je
ne peux pas compiler).


#include <stdexcept>

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in
Ben
Le #105260
OK thank you
I found the way as well by including <exception>, it seems to work.

"Vincent Richard" message news:3f4cba77$0$239$

J'utilise vc++ et "catch (std::exception& e)" ne semble pas possible (je
ne peux pas compiler).


#include <stdexcept>

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in


Ben
Le #105259
Bon ca marche mais en fait je viens de voir que division par zero n'est pas
std::exception donc retour au meme point.

"Ben" news:3f4cbb59$0$16544$
OK thank you
I found the way as well by including <exception>, it seems to work.

"Vincent Richard" in

message news:3f4cba77$0$239$

J'utilise vc++ et "catch (std::exception& e)" ne semble pas possible
(je



ne peux pas compiler).


#include <stdexcept>

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in






Vincent Richard
Le #105092

Bon ca marche mais en fait je viens de voir que division par zero n'est
pas std::exception donc retour au meme point.


Non, cf. ma réponse plus haut.

Il n'y a apparemment (quelqu'un peut confirmer ?) pas de solution standard
pour détecter ce genre d'erreur (qui est plutôt au niveau du système
d'exploitation sur lequel s'exécute ton programme).

Donc, il faut voir du côté de l'API de ton système. Il existe sans aucun
doute des solutions pour intercepter/être notifié de ces erreurs... Dans
ce cas, c'est HS sur ce groupe.

<HS>
Sous Windows, il me semble que tu peux utiliser le SEH (Structured
Exception Handling). Recherche sur Google pour plus d'infos.

Par exemple :

* http://www.drbob42.com/cbuilder/structur.htm
* http://msdn.microsoft.com/library/en-us/debug/base/using_an_excep
--8<-- tion_handler.asp?frame=true (attention, adresse sur 2 lignes)
* ...
* http://www.google.fr/search?hl=fr&q=structured+exception+handling

</HS>

Peut-être voir sur : news:fr.comp.os.ms-windows.programmation .

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in
Frédéri MIAILLE
Le #105091
alors ce que Vincent disait à savoir :
"Tu peux déjà attraper toutes les erreurs "standards" (générées par la
bibliothèque standard) en utilisant un "catch (std::exception& e)", la
description est dans "e.what()"."
devrait suffire.
Car je suppose que la division par 0 doit générer une exception en bonne et
dûe forme. Sinon, généralement on contrôle. Ca peut se faire "inline" avec
un "?".


--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.os.ms-windows.programmation
fr.comp.graphisme.programmation
Serge Paccalin
Le #105090
Le mercredi 27 août 2003 à 16:14, Ben a écrit dans fr.comp.lang.c++ :

J'utilise vc++ et "catch (std::exception& e)" ne semble pas possible (je
ne peux pas compiler).


#include <stdexcept>

OK thank you

I found the way as well by including <exception>, it seems to work.

Bon ca marche mais en fait je viens de voir que division par zero n'est pas

std::exception donc retour au meme point.


[Tu peux répondre en-dessous, s'il te plaît ? Le français se lit de haut
en bas...]

Si tu as plusieurs types d'exceptions à traiter, tu peux mettre
plusieurs catch(), à raison d'un par type, avec catch(...) en dernier :

try
{
// le code qui va générer des exceptions
}
catch (std::exception &e)
{
std:cout << "std::exception" << e.what() << std::endl;
}
catch(const char *str)
{
std::cout << "Caught exception: " << str << std::endl;
}
catch(unsigned n)
{
std::cout << "Caught exception: " << std::hex << n << std::endl;
}
catch(...)
{
std::cout << "Caught unknown exception" << std::endl;
}



--
___________ 2003-08-27 17:47:51
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763




Vincent Richard
Le #105087

Frédéri MIAILLE wrote:
Car je suppose que la division par 0 doit générer une exception en
bonne et dûe forme.


Non, pas d'après la norme (c'est un UB), et je ne connais pas de
plate-forme qui permette directement de gérer les divisions par 0 sous
forme d'exceptions C++.


<HS>
Il y a quelque chose qui y ressemble assez (avec des mots-clés non
standards) sous Windows avec Visual C++ : voir mon précédent message
concernant le SEH (Structured Exception Handling).
</HS>

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in

Poster une réponse
Anonyme