#1 Le 07/10/2008, à 11:33
- Kranagard
[résolu][c++] probleme d'exception (niveau tres faible)
mais probleme que j'ai du mal a trouver quand meme
voila j'ai un tout petit bout d'applic sur lequel j'aimerai utiliser une exception:
void PRIMEASSURANCE::setBonusMalus(int value)
{
if(value<0 || value>12)
throw(new InvalidBonusMalusException());
bonusMalus = value;
}
et dans mon main (p etant un objet PRIMEASSURANCE)
try{
p.setBonusMalus(20);
}
catch(InvalidBonusMalusException& e)
{
cout<<e;
}
InvalideBonusMalusException contient juste un string mais si je remplace par throw string("erreur"); j'ai la meme erreur donc je ne pense pas que ça vienne de la.
a la compilation pas de souci (logique) mais a l'execution le throw me fait un segmentation fault. que je fasse throw(1), throw string("") ou throw maclasse j'ai le meme resultat... j'ai raté un include ou quelquechose?
j'uilise namespace std au passage.
ps: l'exception surcharge evidement l'operateur <<
Dernière modification par Kranagard (Le 08/10/2008, à 17:19)
Hors ligne
#2 Le 07/10/2008, à 12:32
- tiky
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Bonjour,
Je ne vois pas d'erreur dans ton code. Peux-tu donner la déclaration de ta classe InvalidBonusMalusException?
Voici-ci une page qui pourra t'aider: http://cpp.developpez.com/cours/cpp/?page=page_11#LXI
Dernière modification par tiky (Le 07/10/2008, à 12:32)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#3 Le 07/10/2008, à 13:11
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
#ifndef _EXCEPTION_H
#define _EXCEPTION_H
#include <iostream>
using namespace std;
class EXCEPTIONBASE
{
private:
char *msg;
public:
EXCEPTIONBASE();
~EXCEPTIONBASE();
void setMsg(char* _msg);
char* getMsg();
friend ostream& operator<<(ostream& s,EXCEPTIONBASE& except);
};
class InvalidBonusMalusException:EXCEPTIONBASE{
public:
InvalidBonusMalusException();
~InvalidBonusMalusException();
friend ostream& operator<<(ostream& s,InvalidBonusMalusException& except);
};
class WrongComputedResult:EXCEPTIONBASE{
public:
WrongComputedResult();
~WrongComputedResult();
friend ostream& operator<<(ostream& s,WrongComputedResult& except);
};
#endif
#include "Exception.h"
EXCEPTIONBASE::EXCEPTIONBASE()
{
msg = NULL;
}
EXCEPTIONBASE::~EXCEPTIONBASE() //liberation de la memoire
{
if(msg != NULL)
delete [] msg;
}
void EXCEPTIONBASE::setMsg(char* _msg)
{
msg = new char[strlen(_msg)+1];
strcpy(msg,_msg);
}
char* EXCEPTIONBASE::getMsg()
{
return msg;
}
ostream& operator<<(ostream& s, EXCEPTIONBASE& except)
{
if(except.getMsg()!=NULL)
s<<endl<<"**********"<<endl<<except.getMsg()<<endl<<"**********"<<endl;
return s;
}
InvalidBonusMalusException::InvalidBonusMalusException()
{
setMsg((char*)"La valeur du Bonus/Malus doit etre comprise entre 0 et 12 compris");
}
InvalidBonusMalusException::~InvalidBonusMalusException()
{
}
ostream& operator<<(ostream& s, InvalidBonusMalusException& except)
{
if(except.getMsg()!=NULL)
s<<endl<<"**********"<<endl<<except.getMsg()<<endl<<"**********"<<endl;
return s;
}
WrongComputedResult::WrongComputedResult()
{
setMsg((char*)"Un probleme est survenu lors du calcul de la prime");
}
WrongComputedResult::~WrongComputedResult()
{
}
ostream& operator<<(ostream& s, WrongComputedResult& except)
{
if(except.getMsg()!=NULL)
s<<endl<<"**********"<<endl<<except.getMsg()<<endl<<"**********"<<endl;
return s;
}
mais le probleme a lieu meme si je throw un int et non un objet
Hors ligne
#4 Le 07/10/2008, à 13:15
- tiky
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Tu es sûr que le segment fault vienne de là? Utilise gdb pour trouver la ligne où le segment fault se produit.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#5 Le 07/10/2008, à 13:45
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
PRIMEASSURANCE::setBonusMalus (this=0xbfbe0d50, value=20)
at PrimeAssurance.cpp:65
65 if(value<0 || value>12)
(gdb)
67 InvalidBonusMalusException e;
(gdb)
InvalidBonusMalusException (this=0xbfbe0cf0) at Exception.cpp:34
34 InvalidBonusMalusException::InvalidBonusMalusException()
(gdb)
EXCEPTIONBASE (this=0xbfbe0cf0) at Exception.cpp:5
5 msg = NULL;
(gdb)
6 }
(gdb)
InvalidBonusMalusException (this=0xbfbe0cf0) at Exception.cpp:36
36 setMsg((char*)"La valeur du Bonus/Malus doit etre comprise entre 0 et 12 compris");
(gdb)
EXCEPTIONBASE::setMsg (this=0xbfbe0cf0,
_msg=0x804d50c "La valeur du Bonus/Malus doit etre comprise entre 0 et 12 compris") at Exception.cpp:15
15 msg = new char[strlen(_msg)+1];
(gdb)
16 strcpy(msg,_msg);
(gdb)
17 }
(gdb)
InvalidBonusMalusException (this=0xbfbe0cf0) at Exception.cpp:37
37 }
(gdb)
PRIMEASSURANCE::setBonusMalus (this=0xbfbe0d50, value=20)
at PrimeAssurance.cpp:68
68 throw(e);
(gdb)
Program received signal SIGSEGV, Segmentation fault.
e est bien instancié mais throw declanche l'erreur...
Hors ligne
#6 Le 07/10/2008, à 14:14
- tiky
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Retire le mot-clef new lorsque tu lances l'exception avec throw... Je ne l'avais pas vu. Tu ne récupères pas un pointeur sur l'exception mais une référence dans catch. Par ailleurs si tu fais un new, tu auras une fuite de mémoire puisque tu ne libères pas cette mémoire. On ne peut convertir explicitement un pointeur et une référence.
object * ptr = new object;
object & ref = ptr; ( ! faux )
Par contre:
object * ptr = new object;
object & ref = *ptr;
ptr = &ref;
Dernière modification par tiky (Le 07/10/2008, à 14:20)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#7 Le 07/10/2008, à 14:21
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
void PRIMEASSURANCE::setBonusMalus(int value)
{
if(value<0 || value>12)
{
InvalidBonusMalusException e;
throw(e);
}
bonusMalus = value;
}
toujours le meme probleme, je l'avais corrigé en me rendant compte du fait que c'etait un pointeur (j'suis plus habitué au java, mais j'ai fais pas mal de c et de cpp l'an dernier)
ce qui est vraiment etrange c'est que meme comme ça:
void PRIMEASSURANCE::setBonusMalus(int value)
{
if(value<0 || value>12)
{
throw(0);
}
bonusMalus = value;
}
il me fait un segfault
Dernière modification par Kranagard (Le 07/10/2008, à 14:27)
Hors ligne
#8 Le 07/10/2008, à 22:11
- nicolas66
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Perso, je te conseille de faire éventuellement plusieurs classes d'exception en dérivant de `std::exception'. Tu peux aussi utiliser directement l'exception `std::logic_error'.
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne
#9 Le 07/10/2008, à 23:15
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
le probleme est que ceci est un cas d'ecole, il ne doit donc pas etre logique mais carré. et vu la logique de mes profs je ne peux pas utiliser la class std::exception.
j'utilise NetBeans pour develloper, je me suis dit que ça venait peut etre de son make donc j'ai fais le mien (ça faisait longtemp)
CC=g++
CFLAGS=-c
LDFLAGS=
SOURCES=Client.cpp ContratAssurance.cpp Juriste.cpp MembrePersonnel.cpp Personne.cpp PrimeAssurance.cpp Exception.cpp main2.cxx
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=Test1
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o ./Test1
Client.o: Client.cpp Client.h Vector.h
$(CC) $(CFLAGS) Client.cpp
ContratAssurance.o: ContratAssurance.cpp ContratAssurance.h
$(CC) $(CFLAGS) ContratAssurance.cpp
Juriste.o : Juriste.cpp
$(CC) $(CFLAGS) Juriste.cpp
MembrePersonnel.o: MembrePersonnel.cpp
$(CC) $(CFLAGS) MembrePersonnel.cpp
Personne.o: Personne.cpp Personne.h
$(CC) $(CFLAGS) Personne.cpp
PrimeAssurance.o: PrimeAssurance.cpp PrimeAssurance.h Exception.h
$(CC) $(CFLAGS) PrimeAssurance.cpp
Exception.o: Exception.cpp Exception.h
$(CC) $(CFLAGS) Exception.cpp
main2.o: main2.cxx
$(CC) $(CFLAGS) main2.cxx
clean :
rm -f *.o
il compile comme il faut en release (contrairement a netbeans d'ailleur qui tourne qu'en debbug) mais le resultat est le meme...
segfaul que j'utilise throw(0) ou throw(object)...
Hors ligne
#10 Le 08/10/2008, à 02:20
- nicolas66
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Perso, j'ai testé ton code et j'ai jamais eu de segfault
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne
#11 Le 08/10/2008, à 06:42
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
lol, je me disais bien que ça devait pas venir du code... mais du coup je vois pas trop pourquoi il me fait un segfault
merci a toi, je vais pouvoir continuer et tester sur un autre pc plus tard sachant que ça tourne
Hors ligne
#12 Le 08/10/2008, à 07:10
- robrob
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Une remarque, c'est dommage d'utiliser des char* en C++
Tu devrais essayer de mettre des std::string à la place ce serait plus propre (et C++ friendly).
Sinon pour le segfault compile ton programme avec le flag -g (debug) et lance le sous valgrind:
http://valgrind.org/docs/manual/quick-start.html#quick-start.mcrun
Il devrait t'indiquer précisément la cause du problème.
edit: pour le flag -g c'est aussi valable pour gdb
Dernière modification par robrob (Le 08/10/2008, à 07:12)
Hors ligne
#13 Le 08/10/2008, à 09:36
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
si seulement j'avais le droit d'utiliser les string, j'en reve presque, mais comme je l'ai dit il sagit d'un cas d'école qui comprends ses limitations...
Hors ligne
#14 Le 08/10/2008, à 10:59
- tiky
Re : [résolu][c++] probleme d'exception (niveau tres faible)
si seulement j'avais le droit d'utiliser les string, j'en reve presque, mais comme je l'ai dit il sagit d'un cas d'école qui comprends ses limitations...
Il te force à code en C dans du C++? C'est n'importe quoi... Le C++ n'est rien sans sa bibliothèque standard.
Pour le segment fault qui ne se produit pas chez d'autres personnes, ça ne veut en rien dire que le code est juste. Un segment fault ne se produit pas de façon systématique car sa venu dépend de beaucoup de variables, dont la charge du système, la quantité de mémoire vive, ... ( et beaucoup d'autres ). Bref comme conseillé précédement, pour confirmer qu'il s'agisse d'un problème lié à ton système et non ton programme, il faut utiliser valgrind après avoir compilé ton code avec l'option -g.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#15 Le 08/10/2008, à 13:05
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
j'ai compilé avec -g, testé et retesté puis testé normalement mais ce matin le probleme ne se pose plus... j'imagine qu'hiberner 4h lui a fait du bien (ça faisait plus de 50h que je bossais dessus et j'ai dormi 4h )
maintenant mes exception tourne comme il faut apparement.
effectivement utiliser du c en c++ c'est n'importe quoi mais j'ai beau le dire aux profs ils s'en foutent.
je sent que je vais leur pondre une interface en qt pour les calmer vu qu'ils parlent pas de l'interface
en tout cas merci de ton aide, j'ai appris pleins de trucs sur les debbuger que j'imaginais meme pas ayant ete forcé d'utiliser dbx par le passé...
Hors ligne
#16 Le 08/10/2008, à 16:47
- nicolas66
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Hum juste pour info, j'avais rédigé une page sur Valgrind.
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne
#17 Le 08/10/2008, à 17:19
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
je l'ai mis en favoris, je l'instal tantot et je test ça mais ça me parait pas mal pratique.
Hors ligne
#18 Le 08/10/2008, à 17:53
- Link31
Re : [résolu][c++] probleme d'exception (niveau tres faible)
j'ai compilé avec -g, testé et retesté puis testé normalement mais ce matin le probleme ne se pose plus...
Attention à ça. Un exécutable compilé en debug contient plus de données, et est donc plus gros en mémoire. Les segfaults se produisent donc moins souvent. Ça ne veut pas dire que le problème est réglé.
Hors ligne
#19 Le 08/10/2008, à 22:19
- Kranagard
Re : [résolu][c++] probleme d'exception (niveau tres faible)
en debbug quand je passe sur le throw mais qu'il ne se trouve pas dans un bloc try il me marque convenablement le fait qu'une exception a ete lancée mais non recuperée, que se soit en debug ou en release maintenant.
a voir dans le future mais je n'ai pas eu une seul fois le probleme aujourd'hui
Hors ligne
#20 Le 08/10/2008, à 22:33
- tiky
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Kranagard a écrit :j'ai compilé avec -g, testé et retesté puis testé normalement mais ce matin le probleme ne se pose plus...
Attention à ça. Un exécutable compilé en debug contient plus de données, et est donc plus gros en mémoire. Les segfaults se produisent donc moins souvent. Ça ne veut pas dire que le problème est réglé.
Un heisenbug : http://fr.wikipedia.org/wiki/Heisenbug
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#21 Le 09/10/2008, à 18:10
- Link31
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Un heisenbug
: http://fr.wikipedia.org/wiki/Heisenbug
Exactement. Je ne me souvenais plus que ça avait un nom.
Parfois, il peut être utile de compiler un programme en -O3 pour tester la solidité et la "propreté" du code (surtout en programmation bas-niveau).
Hors ligne
#22 Le 09/10/2008, à 18:30
- tiky
Re : [résolu][c++] probleme d'exception (niveau tres faible)
Il faut également tester le programme en condition extrême, c'est-à-dire très peu de mémoire à disposition, plus d'espace sur le disque, fichier de configuration manquant, etc. Évidemment il n'est pas nécessaire de faire cela durant tout le développement du logiciel, seulement avant de publier une version stable de celui-ci.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne