#ifndef __EXCEPTIONS_H__ #define __EXCEPTIONS_H__ #ifdef __cplusplus #include #include #include /* * Gère les exceptions du système. Le programme principal devrait tenter * de les récupérer afin de les afficher. * GeneralExecption: exception de base. Construite sur une string. * MemoryException: plus assez de mémoire. Construit une string sur la taille mémoire * qui a fait défaut. * IOException: erreur de lecture/écriture. Construite sur le nombre d'octets * et sur l'opération qui a générée l'erreur. * IOGeneral: erreur générale sur une opération IO (erreur à l'ouverture notemment) * IOInternal: erreur interne du programme. En particulier, le programme * a voulu lire ou écrire alors que le Handle n'était pas prévu pour. * * Nous définissons les fonctions xmalloc, xfree et xstrdup. Elles devraient être * utilisées en lieu et place des fonctions malloc, free et strdup. La fonction realloc * étant désapréciée, elle n'est pas surchargée. */ // Impossible de surcharger free(void *). Les compilateurs // refuseront de passer un char * par exemple. #define free(p) xfree((void*)p) // On prédéfinit la classe String, pour éviter // les deadlocks de compilation... class String; class Base { public: char * strdup(const char *) const; void * malloc(ssize_t) const; void * operator new(size_t); void * operator new(size_t, void *); }; class GeneralException : public Base{ public: GeneralException(String); GeneralException(const GeneralException &); ~GeneralException(); char * GetMsg(); protected: GeneralException(); char * msg; static char t[BUFSIZ]; }; class MemoryException : public GeneralException { public: MemoryException(ssize_t); }; enum op_t { IO_WRITE = 1, IO_READ }; class IOException : public GeneralException { public: IOException(String, op_t, ssize_t); }; class IOGeneral : public GeneralException { public: IOGeneral(String); }; class IOInternal : public GeneralException { public: IOInternal(String, op_t); }; char * xstrdup(const char *) throw (MemoryException); void * xmalloc(ssize_t) throw (MemoryException); void xfree(void *&); #else #error This only works with a C++ compiler #endif #endif