Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

excepcion.hpp

Go to the documentation of this file.
00001 
00002 //
00003 // Fichero            : excepcion.hpp
00004 // Autor              : 
00005 // Fecha creacion     : 
00006 // 
00007 // Descripcion        : 
00008 // 
00009 //    La macro EXCEPCION(NombreExcepcion) declara e implementa una
00010 //    clase que deriva de "runtime_error" y cuyo nombre sera "NombreExcepcion".
00011 //         Ej:  EXCEPCION(ExcepcionGen)
00012 //
00013 //    La macro EXCEPCION_DE(ExcBase, NombreExcepcion) declara e implementa una
00014 //    clase que deriva de ExcBase y cuyo nombre sera "NombreExcepcion".
00015 //         Ej:  EXCEPCION_DE(ExcepcionGen, MiExcepcion)
00016 //
00017 //    La macro THROW(Excepcion, Descripcion) instancia un objeto (excepcion)
00018 //    de la clase 'Excepcion' pasandole a su constructor una descripcion 
00019 //    del error que la ha provocado.
00020 //    Y pinta una traza con la informacion de lo que ha pasado
00021 //    El parametro 'Descripcion' puede ser creado a partir de diferentes tipos
00022 //    aunque el resultado es siempre una cadena de texto.
00023 //         Ej:  THROW(MiExcepcion, "error " << 1 << 1.2);
00024 //
00025 // Notas
00026 //    - @ He tenido que poner el include de las trazas antes que los <strstream>
00027 //      y <stdexcept>, ya que al revis no compilaba en HP-UX 11. No me he
00028 //      metido a determinar el porque. Supongo que por temas del preprocesador.
00029 //
00031 
00032 #ifndef _excepcion_h_
00033 #define _excepcion_h_
00034 
00035 #include "jic/log/trazas.hpp"
00036 #include <string>
00037 #include <strstream>
00038 #include <stdexcept>
00039 
00040 
00041 //------------------------------------------------
00042 // MACRO EXCEPCION
00043 //------------------------------------------------
00044 //    La macro EXCEPCION(NombreExcepcion) declara e implementa una
00045 //    clase que deriva de "runtime_error" y cuyo nombre sera "NombreExcepcion".
00046 //------------------------------------------------
00047 #define EXCEPCION(NombreExcepcion) \
00048 class NombreExcepcion : public std::runtime_error \
00049 { \
00050   public: \
00051      NombreExcepcion(const std::string & descripcion = "") \
00052        : std::runtime_error(std::string(# NombreExcepcion) + ( descripcion.empty() ? "" : " : ") + descripcion) \
00053      {} \
00054 }
00055 
00056 //------------------------------------------------
00057 // MACRO EXCEPCION_BASE
00058 //------------------------------------------------
00059 //    La macro EXCEPCION_DE(ExcBase, NombreExcepcion) declara e implementa una
00060 //    clase que deriva de ExcBase y cuyo nombre sera "NombreExcepcion".
00061 //------------------------------------------------
00062 #define EXCEPCION_DE(ExcBase, NombreExcepcion) \
00063 class NombreExcepcion : public ExcBase \
00064 { \
00065   public: \
00066      NombreExcepcion(const std::string & descripcion = "") \
00067        : ExcBase(std::string(#NombreExcepcion) + ( descripcion.empty() ? "" : " : ") + descripcion) \
00068      {} \
00069 }
00070 
00071 //------------------------------------------------
00072 // MACRO THROW
00073 //------------------------------------------------
00074 //    La macro THROW(Excepcion, Descripcion) instancia un objeto (excepcion)
00075 //    de la clase 'Excepcion' pasandole a su constructor una descripcion 
00076 //    del error que la ha provocado.
00077 //    El parametro 'Descripcion' puede ser creado a partir de diferentes tipos
00078 //    aunque el resultado es siempre una cadena de texto.
00079 //------------------------------------------------
00080 #define THROW(Excepcion, Descripcion) \
00081   { \
00082   std::strstream * info = new std::strstream; \
00083   (*info) << Descripcion << " ( " << __FILE__ << ", " << __LINE__ << " )" << std::ends; \
00084   char *cadena = info->str(); \
00085   Excepcion exc(cadena); \
00086   delete cadena; \
00087   delete info; \
00088   SUCESO(exc.what()); \
00089   throw(exc); \
00090   }
00091 
00092 #endif
00093 

Generated on Wed Mar 5 21:31:47 2003 for JIC by doxygen1.3-rc3