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

Recuperation de toutes les erreurs d'execution.

12 réponses
Avatar
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\n");
}

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.

10 réponses

1 2
Avatar
Vincent Richard

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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-

Avatar
Ben
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" wrote in message
news:biiacj$pb1$

"Ben" a écrit dans le message de
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





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

"Vincent Richard" wrote in
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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-



Avatar
Vincent Richard

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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-

Avatar
Ben
OK thank you
I found the way as well by including <exception>, it seems to work.

"Vincent Richard" wrote 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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-



Avatar
Ben
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" wrote in message
news:3f4cbb59$0$16544$
OK thank you
I found the way as well by including <exception>, it seems to work.

"Vincent Richard" wrote
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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-







Avatar
Vincent Richard

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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-

Avatar
Frédéri MIAILLE
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
Avatar
Serge Paccalin
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




Avatar
Vincent Richard

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 <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-


1 2