Bonjour à tous,
Quelqu'un peut-il me dire comment gérer les exceptions en C++ comme avec Delphi avec try, raise, etc.
Bonne journée à tous
Bonjour à tous,
Quelqu'un peut-il me dire comment gérer les exceptions en C++ comme avec Delphi avec try, raise, etc.
Bonne journée à tous
Pour l'essentiel, tu peux lever n'importe quoi comme exception: il n'y a pas de contrainte sur le type de l'exception.
Il est recommander d'attraper l'exception par référence, pour conserver le polymorphisme.
Un fragment d'exemple:
Il y a les en-têtes <exception>, qui définit std::exception, et <stdexcept>, pour une petite hiérarchie d'exception standard.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 try { throw <valeur>; } catch (<type> const& e) { faire quelque chose de l'exception }
Regarde dans notre faq, c'est bien expliqué.
D'ailleurs, je t'invite à la lire d'un bout à l'autre. Il y a de nombreuses choses importantes à comprendre.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
Oui, il est très important de comprendre le RAII en C++. Il n'y a pas de finally, il y a un truc implicite (et non explicite comme finally) pour restituer de façon déterministe les ressources.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Un petit complément d'explication, parce que j'ai le temps
Le RAII ou Réduction en Amont Intelligente des Incidents (c'est ma traduction, en vrai, c'est Ressource Acquisition Is Initialisation)
C'est l'art d'utiliser la destruction automatique des variables.
Toute variable est automatiquement et assurément détruite quand elle cesse d'être visible: c'est à dire quand l'exécution du programme sort de la portée de définition de la variable.
Supposons que tu veuille ouvrir un fichier.
En C, tu utiliserais fopen(). puis fclose() quand il deviendrai inutile.
Sauf qu'il faut surveiller chaque exception possible, pour appeler un fclose(), et relancer l'exception, parce que ce n'était qu'un petit nettoyage local.
Et puis, si j'ai trois fichiers, une base de donnée, deux sockets, un vecteur de pointeurs vers des plugins et trois pipes, ce sont des dizaines de controles à faire, à chacune des centaines de situations possibles.
Du coup, on utilise la magie ... pardon, les paires constructeurs/destructeurs.
Pourquoi magie? parce que le langage garantit que si un constructeur est appelé, soit un exception est levée par celui-ci, soit le destructeur sera appelé à la fin du scope de construction.
Par l'exemple, ca donne:
Si le constructeur de la classe Truc jette une exception (throw), la position A n'est jamais atteinte, et le code reprendra dans un catch englobant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 { //du code Truc t; // A // encore du code // B }
Sinon quand on sortira de la paire d'accolade (au plus tard, en B), t sera détruite via le destructeur de la classe Truc.
Mais si une exception est levée avant B, ou si on rencontre un break, un continue, un return, ou un goto (mais ca ne devrait pas arriver), qui fait sortir du bloc courant, t sera aussi détruite.
Imagine une classe ainsi codée:
avec ca, il suffit de faire ceci:
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 class Fichier { private: File* file; public: Fichier(const char* filename) : file(fopen(filename)) { if (!file) throw file_not_found(); } ~Fichier() { fclose(file); } //des fonctions reproduisant fread, fget etc. string première_ligne() const; }
Et tu sais d'avance que le fichier sera jamais ouvert ou forcément fermé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int main() { Fichier fichier("mon_beau_fichier"); cout << fichier.première_ligne() << endl; }
C'est la magie de RAII.
Evidemment, Fichier existe déjà: c'est std::fstream.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
NB: quand il n'y a qu'une seule ressource, ou peu de chemins d'erreurs on ne se rend pas forcément compte à quel point il est difficile, pour ne pas dire impossible, d'écrire un code correct où la gestion des erreurs est confiée à catch.
Cet article décrit assez bien la situation, et les solutions bonnes comme mauvaises : http://alexandre-laurent.developpez....ou-exceptions/
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager