Page principale | Liste alphabétique | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier | Pages associées

Error.h

Aller à la documentation de ce fichier.
00001 /*! \file Error.h
00002     \brief Gestion d'erreurs.
00003 
00004     Sytème de gestion des exception (localisation, désignation).
00005 
00006     \author     aerith (http://aerith.fr)
00007     \version    1.0
00008     \date       20/05/2008
00009 */
00010 
00011 #ifndef INCLUDE_RSRC_ERROR
00012 #define INCLUDE_RSRC_ERROR
00013 
00014 #include    "../Surcouche/SurcoucheMultitache.h"
00015 #include    "../Tools/Tools.h"
00016 #include    "ErrorCode.h"
00017 #include    <stdlib.h>
00018 #include    <time.h>
00019 #include    <stdarg.h>
00020 #include    <string>
00021 #include    <vector>
00022 #include    <iostream>
00023 #include    <fstream>
00024 
00025 using namespace std;
00026 
00027 #define     ERROR_DEFLANG   "../../files/ErrorCode.FR"  /*!< Fichier des erreurs par defaut.            */
00028 #define     ERROR_BUFFER    1024                        /*!< Taille du buffer de travail.               */
00029 
00030 //! Informations sur une fonction logée
00031 /*! Informations sur une fonction logée
00032 */
00033 class FuncInfos
00034 {
00035 public      :
00036     string          func;
00037     string          file;
00038     unsigned int    line;
00039 
00040     /*! Initalisé avec des paramètres.
00041         \param pFunc nom de la fonction
00042         \param pFile fichier où se trouve la fonction
00043         \param iLine ligne dans le fichier où se trouve la fonction
00044     */
00045     FuncInfos(const char *pFunc, const char *pFile, unsigned int iLine)
00046     {
00047         func = pFunc;
00048         file = pFile;
00049         line = iLine;
00050     };
00051 };
00052 
00053 //! Pile d'appel d'un thread
00054 /*! Pile d'appel de fonction d'un thread
00055 */
00056 class ThreadCallStack
00057 {
00058 public      :
00059     unsigned int        id;
00060     vector<FuncInfos *> stack;
00061     unsigned int        nbInstance;
00062 
00063     /*! Initalisé avec des paramètres par defauts.
00064     */
00065     ThreadCallStack()
00066     {
00067         id = ThreadId();
00068         nbInstance = 0;
00069     };
00070 };
00071 
00072 typedef struct
00073 {
00074     unsigned int    no;
00075     string          desc;
00076 } ErrorDesc;
00077 
00078 //! Gestion d'erreur
00079 /*! Sytème de gestion des exception (localisation, désignation).
00080 */
00081 class Error
00082 {
00083 private     :
00084     static string                       log;                /*!< Fichier des logs.                                          */
00085     static string                       langue;             /*!< Nom du fichier charger ("ErrorCode.FR" par defaut).        */
00086     static vector<ThreadCallStack *>    callStacks;         /*!< Piles d'appel des threads.                                 */
00087     ThreadCallStack                     *currentCallStack;  /*!< Piles d'appel du thread courant.                           */
00088     static vector<ErrorDesc *>          descError;          /*!< Descriptions des codes d'erreurs.                          */
00089     string                              loc;                /*!< Nom de la fonction en cour d'éxécution.                    */
00090     unsigned int                        line;               /*!< Ligne de l'exception.                                      */
00091 
00092     //! Log un message
00093     /*! Log un message vers stderr et un fichier.
00094         \param pBuffer chaine construite comme pour printf.
00095         \param ... argument pour construire la chaine
00096     */
00097     void    LogError(const char *pBuffer, ...);
00098 
00099 public      :
00100     /*! Initalisé par defaut en langue "ErrorCode.FR". 
00101     */
00102     Error();
00103 
00104     /*! Libére la mémoire proprement. 
00105     */
00106     ~Error();
00107 
00108     //! Définie le nom du fichier de log
00109     /*! Définie le nom du fichier de log des erreurs.
00110         \param pLog nom de la section
00111     */
00112     inline void     SetLog(const char *pLog)
00113     {
00114         log = pLog;
00115     };
00116 
00117     //! Definie le nom de la fonction courant
00118     /*! Définie le nom de la fonction en cour d'éxécution.
00119         \param pLoc nom de la fonction
00120     */
00121     inline void     SetLoc(const char *pLoc)
00122     {
00123         loc = pLoc;
00124     };
00125 
00126     //! Langue des messages d'erreur
00127     /*! Permet de définir la langue dans laquelle seront les messages d'erreurs (fichier ErrorCode.\a lang).
00128         \param pFile nom du fichier de la langue.
00129     */
00130     void    SetLangue(const char *pFile);
00131 
00132     //! Génère une exception
00133     /*! Enregistre le numéro de la ligne et génère une exception
00134         \param iLine numéro de la ligne
00135         \param iCode code de l'erreur
00136     */
00137     inline void     Throw(unsigned int iLine, unsigned int iCode)
00138     {
00139         line = iLine;
00140         throw iCode;
00141     };
00142 
00143     //! Ajoute une fonction à la liste d'appel
00144     /*! Ajoute une fonction à la suite de la pile d'appel (LIFO).
00145         \param pFunc nom de la fonction courante.
00146         \param pFile nom du fichier de la fonction.
00147     */
00148     void    AddFunc(const char *pFunc, const char *pFile);
00149 
00150     //! Affiche la description de l'erreur
00151     /*! Affiche et log la description de l'exception enregistrée par le systeme.
00152         \param iCode code de l'erreur
00153 
00154     */
00155     void    Perror(unsigned int iCode);
00156 };
00157 
00158 //! Nom de la variable d'erreur
00159 /*! Nom de la variable instanciant la classe de gestion d'erreur.
00160 */
00161 #define     ERRORVAR        SysError
00162 
00163 //! Initialise le systeme
00164 /*! Placer comme une variable.
00165 */
00166 #define     TRY         Error   ERRORVAR; try {
00167 
00168 //! Génère une exception
00169 /*! Enregisre la ligne de l'erreur et génère une exception.
00170     \param code code de l'erreur
00171 */
00172 #define     THROW(code)     ERRORVAR.Throw(__LINE__, code);
00173 
00174 //! Nom du fichier des log
00175 /*! Spécifie le fichier utilise pour loger les erreurs de \a PERROR .
00176     \param log nom du fichier
00177 */
00178 #define     LOG(log)        ERRORVAR.SetLog(log);
00179 
00180 //! Nome la section
00181 /*! Permet de nomer la section pour situer l'erreur (nouveau thread ou autre ...).
00182     \param func nom de la section
00183 */
00184 #define     LOC(func)       ERRORVAR.SetLoc(func);
00185 
00186 //! Langue des messages d'erreur
00187 /*! Permet de définir la fichier pour la langue dans laquelle seront les messages d'erreurs.
00188     \param fichier fichier utiliser pour la langue. \n
00189     ex : "FR" pour le fichier "ErrorCode.FR"
00190 */
00191 #define     LANG(fichier)   ERRORVAR.SetLangue(fichier);
00192 
00193 //! Traite l'exception et affiche la description de l'erreur
00194 /*! Affiche et log la description de l'exception enregistrée par le systeme.
00195 */
00196 #define     CATCH_PRINT     } \
00197                             catch(unsigned int iCode) { \
00198                                 ERRORVAR.AddFunc(__FUNCTION__, __FILE__); \
00199                                 ERRORVAR.Perror(iCode); \
00200                                 throw; \
00201                             } \
00202                             catch(...) { \
00203                                 ERRORVAR.AddFunc(__FUNCTION__, __FILE__); \
00204                                 ERRORVAR.Perror(ERROR_C_UNKNOW); \
00205                                 throw ERROR_C_UNKNOW; \
00206                             }
00207 
00208 //! Sauve le nom de la fonction et fait suivre l'exception
00209 /*! Sauve le nom de la fonction et fait suivre l'exception
00210 */
00211 #define     CATCH           } \
00212                             catch(unsigned int iCode) { \
00213                                 ERRORVAR.AddFunc(__FUNCTION__, __FILE__); \
00214                                 throw; \
00215                             } \
00216                             catch(...) { \
00217                                 ERRORVAR.AddFunc(__FUNCTION__, __FILE__); \
00218                                 throw ERROR_C_UNKNOW; \
00219                             }
00220 
00221 
00222 #endif

Généré le Thu Jun 12 09:12:29 2008 pour A.I.F. par  doxygen 1.3.9.1