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

Nom de la fonction ayant lancé l'exception

13 réponses
Avatar
Faussard Guillaume
Salut,

je voulais savoir s'il existait un moyen simple de savoir quelle fonction a
lancé
telle ou telle exception. Je m'explique:

actuellement, je fais les choses de cette maniere:

void classeA::methode1() {
try {
if(blabla)
throw Erreur("ClasseA::methode1()");
}
}
catch(Erreur erreur) {
erreur.affiche();
}

Ainsi, quand je récupère mes exception, je peux afficher à l'écran le nom de
la fonction qui l'a lancée
et ainsi savoir où se trouve l'endroit quasi-exact ou a eu lieu le problème.
Mais bon, c'est vraiment pas
très joli, et en plus, ça peut être source d'erreur puisque le nom de la
fonction est "entré à la main"... Il
n'existe pas une méthode plus propre pour connaitre l'origine d'une
exception ?

Merci ^^

10 réponses

1 2
Avatar
Fabien SK
On Thu, 24 Jul 2003 18:41:04 +0200, Fabien LE LEZ wrote:

On Thu, 24 Jul 2003 18:32:26 +0200, "Faussard Guillaume"
<guillaume.faussard0talcdotfr (replace dot and 0)> wrote:

void classeA::methode1() {
try {
if(blabla)
throw Erreur("ClasseA::methode1()");
}


Autre solution, pas forcément plus propre mais un peu plus sûre :
[...]



Sinon il y a des moyens non portables de récupérer la pile (au moins avec
la glibc et avec imghelp.dll pour Visual C++)


Avatar
Faussard Guillaume
"Fabien LE LEZ" a écrit dans le message news:

On Thu, 24 Jul 2003 18:32:26 +0200, "Faussard Guillaume"
Autre solution, pas forcément plus propre mais un peu plus sûre :

#define MACRO_THROW_Erreur throw Erreur (__FILE__ " " __LINE__)

void classeA::methode1() {
try {
if(blabla)
MACRO_THROW_Erreur;
}


Oui, j'avais pensé à quelque chose coùmme ça pendant un moment, mais ça
oblige à avoir les sources devant les yeux
pour comprendre ce qu'il se passe, tandis qu'avec le nom de la méthode,
l'utilisateur lamba du logiciel
peut comprendre assez faciulement la cause de l'exception.

Avatar
Julien Blanc
Faussard Guillaume wrote:
"Fabien LE LEZ" a écrit dans le message news:


On Thu, 24 Jul 2003 18:32:26 +0200, "Faussard Guillaume"
Autre solution, pas forcément plus propre mais un peu plus sûre :

#define MACRO_THROW_Erreur throw Erreur (__FILE__ " " __LINE__)

void classeA::methode1() {
try {
if(blabla)
MACRO_THROW_Erreur;
}



Oui, j'avais pensé à quelque chose coùmme ça pendant un moment, mais ça
oblige à avoir les sources devant les yeux
pour comprendre ce qu'il se passe, tandis qu'avec le nom de la méthode,
l'utilisateur lamba du logiciel
peut comprendre assez faciulement la cause de l'exception.


normalement, le debogueur fourni avec ton environnement de développement
doit pouvoir te permettre cela. Si tu utilises gcc, ddd est assez visuel
et pas trop compliqué d'emploi.

--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.


Avatar
Christophe de Vienne
"Faussard Guillaume" <guillaume.faussard0talcdotfr (replace dot and 0)>
wrote:


"Fabien LE LEZ" a écrit dans le message news:

On Thu, 24 Jul 2003 18:32:26 +0200, "Faussard Guillaume"
Autre solution, pas forcément plus propre mais un peu plus sûre :

#define MACRO_THROW_Erreur throw Erreur (__FILE__ " " __LINE__)

void classeA::methode1() {
try {
if(blabla)
MACRO_THROW_Erreur;
}


Oui, j'avais pensé à quelque chose coùmme ça pendant un moment, mais ça
oblige à avoir les sources devant les yeux
pour comprendre ce qu'il se passe, tandis qu'avec le nom de la méthode,
l'utilisateur lamba du logiciel
peut comprendre assez faciulement la cause de l'exception.



Tu n'as qu'à utiliser la macro __FUNCTION__, et si tu utilises gcc, il y a
__PRETTY_FUNCTION__.



--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.


Avatar
Jean-Marc Bourguet
Christophe de Vienne writes:

Tu n'as qu'à utiliser la macro __FUNCTION__, et si tu utilises gcc, il y a
__PRETTY_FUNCTION__.


C'est pas du C99, __FUNCTION__?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Christophe de Vienne
Jean-Marc Bourguet wrote:

Christophe de Vienne writes:

Tu n'as qu'à utiliser la macro __FUNCTION__, et si tu utilises gcc, il y
a __PRETTY_FUNCTION__.


C'est pas du C99, __FUNCTION__?


Je n'en ai pas la moindre idée :-)
D'un point de vue pratique je l'utilise, mais sans réellement savoir sa
portabilité. Cela dit ça à l'air plus standard que __PRETTY_FUNCTION__ qui
est, semble-t-il, spécifique à gcc.

A+


--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.


Avatar
David Brabant
"Christophe de Vienne" wrote

D'un point de vue pratique je l'utilise, mais sans réellement savoir sa
portabilité. Cela dit ça à l'air plus standard que __PRETTY_FUNCTION__ qui
est, semble-t-il, spécifique à gcc.


Pour info, __FUNCTION__ existe en VC++ 7.0 qui offre également
__FUNCDNAME__ pour le nom décoré et __FUNCSIG__ pour
la signature.

--
David

Avatar
Richard Delorme

Christophe de Vienne writes:

Tu n'as qu'à utiliser la macro __FUNCTION__, et si tu utilises gcc, il y
a __PRETTY_FUNCTION__.


C'est pas du C99, __FUNCTION__?


Non, en C99 c'est __func__, qui n'est pas une macro mais une chaîne de
caractère constante et statique (static const char __func__[] = ...).

--
Richard


Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > Jean-Marc Bourguet writes:
| >
| > | C'est pas du C99, __FUNCTION__?
| >
| > non, cela aurait été trop facile d'homologuer une pratique existante :-)
| >
| > C99 l'appelle __func__.
|
| Devinons, parce que __FUNCTION__ ressemble a une macro et que ce ne
| peut pas en etre une?

Cela peut être une explication officielle d'un porte paraole du comité :-)

Je n'ai la moindre idée de comment les débats se sont déroulés.

-- Gaby
Avatar
Fabien LE LEZ
On Fri, 25 Jul 2003 11:26:14 +0200, "David Brabant"
wrote:

Pour info, __FUNCTION__ existe en VC++ 7.0 qui offre également
__FUNCDNAME__ pour le nom décoré et __FUNCSIG__ pour
la signature.


Par contre, aucun n'existe en BC++ 5.02 (faut dire aussi qu'il est
déjà très très vieux :-/ )

--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

1 2