OVH Cloud OVH Cloud

Quitter l'appelant

13 réponses
Avatar
blc
Bonjour,

j'ai une fonction qui gere mes erreurs et j'aimerais faire que quand
cette fonction est appelee, elle quitte automatiquement la fonction
appelante.
Y t'il un moyen simple et "joli" de faire ca?

Merci d'avance,
Benoit

10 réponses

1 2
Avatar
Philippe Guglielmetti
la démarche "normale" est plutôt de quitter la fonction qui génère l'erreur
avec un "throw"
et de gérer l'erreur dans un bloc try/catch. Ca a l'avantage de quitter
"proprement" les fonctions en erreur, en restituant la mémoire et tout.
Autrement, chaque fois que tu appelles ta gestion d'erreur, fais un return
juste après...
--
Philippe Guglielmetti - www.dynabits.com
Avatar
blc
Philippe Guglielmetti wrote:
la démarche "normale" est plutôt de quitter la fonction qui génère l'erreur
avec un "throw"
et de gérer l'erreur dans un bloc try/catch. Ca a l'avantage de quitter
"proprement" les fonctions en erreur, en restituant la mémoire et tout.
Autrement, chaque fois que tu appelles ta gestion d'erreur, fais un return
juste après...
C'est ce que je fais mais je me demandais si on pouvait pas faire plus

jolie..

Merci,
Benoit

Avatar
Fabien LE LEZ
On Wed, 08 Oct 2003 10:28:15 +0200, blc wrote:

j'ai une fonction qui gere mes erreurs et j'aimerais faire que quand
cette fonction est appelee, elle quitte automatiquement la fonction
appelante.


C'est le principe des exceptions.

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
blc
Fabien LE LEZ wrote:
On Wed, 08 Oct 2003 10:28:15 +0200, blc wrote:

C'est le principe des exceptions.
Mais a part ca? Apparemment ca semble pas possible. Ya pas un truc du

style return (nbReturnAFaireDAffilee)?? ;-)
Non? Tant pis.

Benoit

Avatar
_M.B._
"blc" a écrit dans le message news:
3f842016$
Fabien LE LEZ wrote:
On Wed, 08 Oct 2003 10:28:15 +0200, blc wrote:

C'est le principe des exceptions.
Mais a part ca? Apparemment ca semble pas possible. Ya pas un truc du

style return (nbReturnAFaireDAffilee)?? ;-)
Non? Tant pis.



Si, c'est le principe des exceptions.

A l'endroit de ton erreur, dans ta fonction appelée,
tu fais un throw() pour declencher une exception.

Le mecanisme remonte alors dans la pile des fonctions
appelantes, jusqu'a qu'il rencontre un bloc catch()
qui intercepte l'erreur.

Donc, pour parler avec les mains, ca fait des 'return' jusqu'a
que ca tombe dans une fonction appelante qui a un bloc catch()
pour gerer l'erreur.

MB


Avatar
tib.motuelle
blc wrote in message news:<3f842016$...
Fabien LE LEZ wrote:
On Wed, 08 Oct 2003 10:28:15 +0200, blc wrote:

C'est le principe des exceptions.
Mais a part ca? Apparemment ca semble pas possible. Ya pas un truc du

style return (nbReturnAFaireDAffilee)?? ;-)
Non? Tant pis.



Tu peux toujours utiliser une macro (qui appelle ta fonction de
gestion d'erreurs et fait un return si nécessaire).

Bertrand.


Avatar
blc
_M.B._ wrote:
"blc" a écrit dans le message news:
3f842016$
Si, c'est le principe des exceptions.

A l'endroit de ton erreur, dans ta fonction appelée,
tu fais un throw() pour declencher une exception.

Le mecanisme remonte alors dans la pile des fonctions
appelantes, jusqu'a qu'il rencontre un bloc catch()
qui intercepte l'erreur.
Desole d'insister... Mais a part les exceptions? Supposons que le code

soit deja ecrit (sans try ni catch) et que je ne puisse changer
uniquement que le code de la fonction appelee (celle qui est sensee
gerer les erreurs)?

Merci,
Benoit

Avatar
Benoit Dejean
Le Thu, 09 Oct 2003 09:21:39 +0200, blc a écrit :

Desole d'insister... Mais a part les exceptions?


Les exceptions c'est très bien, tu serais pas entrain de faire de la
parano sur les perfs ?

Supposons que le code
soit deja ecrit (sans try ni catch) et que je ne puisse changer


si tu ne changes pas la conception, tu n'as que les exceptions

uniquement que le code de la fonction appelee (celle qui est sensee
gerer les erreurs)?


j'avais été confronté au même problème et j'avais découvert (pour
moi même) que std::exit et ses potes sont à bannir à cause de leur
comportement et j'avais conclu que les exceptions était la solution la
plus adaptée

Avatar
blc
Benoit Dejean wrote:

Les exceptions c'est très bien, tu serais pas entrain de faire de la
parano sur les perfs ?
Non, pas du tout, c'est juste un probleme de commodite. Je ne peux/veux

pas retoucher au "code appelant"...

Benoit

Avatar
Gourgouilloult
blc wrote:

Desole d'insister... Mais a part les exceptions? Supposons que le code
soit deja ecrit (sans try ni catch) et que je ne puisse changer
uniquement que le code de la fonction appelee (celle qui est sensee
gerer les erreurs)?


J'essaye de comprendre le problème :

void gere_erreur () { ... }

void g ()
{
// ...
if (erreur)
{
gere_erreur ();
}
}

void f ()
{
g ();
// ...
}

Et tu voudrais que gere_erreur() remonte en partie la pile d'appel ?
Je ne cerne pas trop précisément ce que tu ne veux pas toucher, alors je
vois trois possibilités :

1. Tu peux modifier f(), auquel cas les exceptions vont très bien.

2. Tu peux modifier g(), et un return après l'appel à gere_erreur() va
très bien.

3. Tu ne peux modifier ni l'une ni l'autre, et je ne vois pas en quoi
c'est viable, en termes de conception : tu voudrais revenir dans un état
d'erreur, à une fonction qui ne s'imagine même pas qu'il puisse y en
avoir une. Pour s'en rendre mieux compte, imagine que g() renvoie
quelque chose. Si gere_erreur() doit remonter jusqu'à f(), on retourne
quelle valeur et comment ? Et qu'est-ce que f() est supposé en faire ?
A moins qu'il y ait déjà tout ce qu'il faut, tu es coincé.

Question subsidiaire : si tu dois ne pas modifier g(), comment tu fais
pour y placer un appel à ta fonction gere_erreur () ?

Merci,
Benoit


Gourgouilloult du Clapotis
Si je suis à côté de ce que tu voulais, va falloir être un peu plus
explicite ;)

1 2