Gestion des exceptions en C++

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 27 sept. 2007 à 10:14
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 28 sept. 2007 à 17:31
Bonjour,

Je me posais une question sur les exceptions en C++ : les fameux try catch!
est ce que une exception remonte de sous programme en sous programme ?
je m'explique :  j'ai une gestion d'exception dans une fonction toto

void toto()
{
try
    tata()
catch
}
puis tata () appel titi() et c'est titi qui plante!
est ce que ca remontera jusqu'a toto ?
ensuite ma deuxieme question sera : comment gérer les exceptions? si une erreur est détectée on ferme le programme?

voila merci de me faire partager votre savoir ;-)

 

8 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 sept. 2007 à 11:01
T'es sure que c'est pas tata qui plante (celle du 91) ?
Allez stop les blagues bidons ^_^

Pour ta question, le mieux est de te faire une classe qui gère tes exceptions. A l'aide d'un throw, tu peux faire remonter l'exception jusqu'au premier appellant, c'est à dire le niveau le plus haut.
Sinon pour ma part je ne suis pas partisan de ce genre de bidouille.... C'est anti-performance, et ca laisse la possibilité au programmeur de pondre du code bugué.

Plutot que de perdre du temps sur comment contourner les erreurs et plantage de ton programme, concentre toi plutot a faire un code propre et blindé.

Shell
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
27 sept. 2007 à 11:08
LOL bon deja pas mal la blague !!!

alors oui je suis d'accord avec toi, le seul probleme est que:
 - je suis pas tout seul a coder et que les autres sont pas vraiment dans ce domaine a l'origine
- notre prog doit tourner tout le temps, donc la solution pour ma part est de killer et relancer si erreur detectée
car ton prog tu sais qu'il tourne pendant 2/3jours mais tu sais pas ce qu'il peut se passer dans 2/3semaines
surtout en usine!

autre question tu fais remonter l'exception ok, mais comment tu sais quelle erreur a été générée?pour pouvoir traiter les cas...

 
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 sept. 2007 à 11:22
La gestion d'erreur est très couteuse.
Plutot que de lancer du throw(), il convient de retourner un code d'erreur qui lui ne coute absolument rien.

ciao...
BruNews, MVP VC++
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
27 sept. 2007 à 11:26
oui brunews c'est ainsi que mon code est fait avec des retour de statutdes differentes fonctions!
mais si ca plante dans la fonction,(bug, depassement memoire, ou autre..;)
comment faire?
Avec les exceptions je pensais pouvoir soit bypasser la fonction soit killer le programme
vu qu'a coté j'ai un autre prog. qui relance le prog si celui ci disparait des processus dans le manager des taches!

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 sept. 2007 à 11:38
bug, depassement memoire, mais tout ça doit disparaitre avant d'entrer en prod, on ne livre pas un truc buggé.

ciao...
BruNews, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 sept. 2007 à 11:48
Pour éviter les plantages il n'y a pas une solution unique, c'est pourquoi tu dois faire un maximum de controle sur les données et leur intégrité.
Par exemple ne pas faire une affectation sur une variable de char[64] si les données font une taille de 65, et ainsi de suite.
De la sorte tu vas eviter tout plantage.

Shell
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
27 sept. 2007 à 11:49
ben je vais pas dire le contraire
juste que ya toujours de l'imprevu
c'est du " au cas ou"
je suis pas en train de te dire que je m'en fous et que je fais que de la merde
au contraire, j'essaye de stabiliser par tous les moyens possibles:
test a gogo + surveillance + sécurité diverses...

apres comme je disais on pense pas tjrs a tout surtout avec mon peu d'experience.

 
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
28 sept. 2007 à 17:31
Les exceptions... que des défauts à vous entendre. Franchement, c'est l'idéal pour propager une erreur. Pourquoi utiliser des codes d'erreurs illisible et incompréhensible...

Les exceptions couteuses en cpu ? mais franchement, on s'en fou. C'est lisible et pratique, et pas fait pour les chiens.

[auteur/DEATHCRASH/3585.aspx DeAtHCrAsH] => "Plutot que de perdre du temps sur comment contourner les erreurs et
plantage de ton programme, concentre toi plutot a faire un code propre
et blindé."

Tu as l'air de penser qu'une exception est faite pour gérer les erreurs et plantages du programme. Une exception n'est pas faite pour détecter des bugs et des dépassements de mémoire. Elle est faite pour propager une erreur prévue par le programmeur. Genre tu as une fonction pour charger une image, la méthode basique est de retourner un code d'erreur, l'autre est d 'utiliser une exception contenant le code d'erreur, le fichier concerné et un message d'erreur. Ca permet ensuite d'afficher un message compréhensible à l'utilisateur du programme.

Evidemment on peut toujours utiliser des codes d'erreurs:
if (ret == )
if (ret == )

Les deux méthodes permettent de faire les memes choses, mais l'une est pratique, l'autre pas.

[auteur/LATATADU91/280782.aspx LaTatadu91] => "autre question tu fais remonter l'exception ok, mais comment tu sais quelle erreur a été générée?pour pouvoir traiter les cas..."

A chaque erreur, tu as un type d'exception particulier:
class Exception_Images : public Exception
{...};

class Exception_Images_Chargement  : public Exception_Images
{...};

class Exception_Images_Format_Fichier vide : class Exception_Images_Chargement

{...};


class Exception_Images_Format_Inconnu: class Exception_Images_Chargement

{...};

Ce genre de décomposition te permet ensuite de traiter les exceptions par cas et par catégorie. Mais c'est pas nécessaire, tu peux juste avoir la classe Exception_Images qui prend en paramètre un message d'erreur, mais lors du catch, tu pourras pas traiter précisément les cas.

[auteur/BRUNEWS/39449.aspx ]Donc les exceptions oui pour gérer les situations prévues (bien plus
puissant qu'un code d'erreur), et non pour gérer les erreurs du
programmeurs. Evidemment, si ta grosses préoccupation, c'est la performance, mieux vaut éviter.

PS: C'est mon point de vue évidemment.
0
Rejoignez-nous