Bonjour !
Pour une raison biscornue encore non formalisée par moi, mais que j'exprimerai peut-être en fin de post si j'y arrive, j'en suis arrivé à me poser la question suivante :
Y a-t-il une gestion de la portée différente de d'habitude pour les objets qu'on lance avec throw ?
Bien évidemment, cette question que j'ai travaillée un bon moment peut tout de même ne pas être tout à fait représentative de mon interrogation. C'est pourquoi je vais mettre un peu de code. Imaginons donc une fonction principale qui va essayer de créer un objet dont le constructeur peut lever une exception.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void main_pyr(size_t const im0_size_x, size_t const im0_size_y) { try { Pyr pyr0(im0_size_x, im0_size_y); } catch(...) { ...gestion... } }A priori, pas de soucis en vue (du moins je l'espère), même si je ne vois pas exactement ce qu'il se passe avec cette chaîne de caractères, mais c'est justement l'objet de ce post
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class Pyr { double *pyr_values; public: Pyr(size_t const im_size_x, size_t const im_size_y) { if (une certaine condition n'est pas respectée) { throw "Paramètres non cohérents."; } ...on continue à initialiser l'objet... } };
Donc, mettons qu'au lieu de ce que j'ai écrit au dessus, nous ayons :
L'objet s est déclaré localement dans ma boucle if, et pourtant, il semblerait que je sois capable de l'utiliser dans le catch de ma fonction principale. Est-ce normal ? Est-ce que le compilateur a corrigé quelque chose sans me le dire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (une certaine condition n'est pas respectée) { string s = "Paramètres non cohérents."; throw s; }
Là où intervient vraiment mon problème, c'est que j'ai en réalité déclaré une classe MyException dérivant de la classe de base exception, définie ainsi (j'enlève toutes les fonctions sauf le constructeur) :
Notons que je suis débutant en C++ et que j'ai récupéré ce code dans un tutoriel trouvé sur Internet sans avoir aucun esprit critique. Donc si je comprends bien, notre MyException stocke simplement l'adresse de la chaîne de caractères servant à décrire l'erreur. On est sensé utiliser cette classe ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class MyException : public exception { public: MyException(int number, char const *description, int level) throw() : m_number(number), m_what(description), m_level(level) {} private: int m_number; char const *m_what; int m_level; };
Or, ayant besoin de travailler sur la chaîne de caractères, je ne peux pas l'utiliser comme écrit ci-dessus. C'est là (enfin!) qu'arrive mon problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 throw MyException(10,"Erreur 10 : paramètres incorrects.",1);
Cas 1 :
Ca fonctionne !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char *def = "Paramètres non cohérents."; throw MyException(10,def,1);
Cas 2 :
Ca ne fonctionne pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string s = "Paramètres non cohérents."; throw MyException(10,s.c_str(),1);
Donc je ne comprends pas :
1) Pourquoi le premier cas fonctionne.
2) Si le premier cas fonctionne bien et que c'est normal, pourquoi le deuxième cas ne fonctionne pas. Sachant que je ne suis pas choqué quant au fait que ça ne fonctionne pas.
Merci à tous ceux qui ont tenu le coup jusque là.
Bonne fin de journée !
Raphaël
Partager