Il y a quelques temps j'ai écris une classe Exception. Le principal intéret de cette classe repose sur la possibilité de connaître dans le bloque "catch" dans quel fichier et quel ligne l'exception a était levée. Le tout de manière transparente pour l'utilisateur. Pour faire ça je suis passé par le préprocesseur en trois étapes :
- créer ma classe Exception qui dérive de std::exception, le constructeur prend en paramètre un message, un code, un nom de fichier et un numéro de ligne ;
- "surcharger" le constructeur par une macro du préprocésseur (définie dans Exception.h après la déclaration de la classe) qui s'appèle Exception prend en parametre un message et un code, il passe ses paramètre au constructeur de la classe et passe les macro __LINE__ et __FILE__ au constructeur ;
- dans le fichier Exception.cpp, pour accéder au constructeur j'ai "supprimer" la macro pour ce fichier (avec #undef).
Ca fonctionne comme je le souhaite (j'ai même essayé sur deux compilateurs (gcc et intel)), mais je me demande ce qu'il en ai pour la propreté du code. Je sais qu'il existe les fonction inline ne C++ mais leur traitement se fait après le passage du préprocésseur donc les numéros de ligne et nom de fichier seront ceux de la déclaration des fonctions et pas ceux de l'appelle.
Partager