à ce moment là, il est de ton ressort d'avoir une politique d'exception cohérente
Tu veux qu'une classe dérivée puisse lancer une exception différente pas de problème: met au point une hiérarchie d'exception qui peut apparaitre sous la forme de
et attrape l'exception de base sous la forme de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /* une exception "générique" */ class MyException : public std::exception { public: MyException(std::string const & m):std::exception(),msg(m) { } ~MyException() throw(){} const char* what() const throw(){return msg.c_str();} private: std::string msg; }; /* tes exceptions réelles, qui ne font que réaliser l'exception de base */ class BadRange : public MyException { public: BadRange():MyException("Valeur hors des limites permises"){} }; class InvalidParameterValue :public MyException { public: InvalidParameterValue ():MyException("valeur de parametre invalide") { } };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void g(A& param, int val) { try { param.f(val); } catch(MyException &e) { /* gestion de l'exception */ } }il ne faut pas confondre le polymorphisme et les comportements polymorphes...Là je ne te comprends pas du tout. Où est la notion de "substitution", si tu enlèves le polymorphisme ?
Le polymorphisme peut tout à fait s'appliquer sur une série de comportements polymorphes, mais d'autres comportements peuvent rester parfaitement stables et non polymorphes
Le principe de liskov s'applique sur ces comportements qui n'ont pas pour vocation d'être réimplémentés dans les classes dérivées
Partager