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