]> Creatis software - gdcm.git/blob - src/gdcmException.cxx
ENH: Adding 'gdcm' namespace. Be nice with me this was a ~13000 lines patch. Also...
[gdcm.git] / src / gdcmException.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmException.cxx,v $
5   Language:  C++
6   Date:      $Date: 2004/10/12 04:35:46 $
7   Version:   $Revision: 1.20 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 #include "gdcmException.h"
20
21 #include <typeinfo>
22 namespace gdcm 
23 {
24
25 //-----------------------------------------------------------------------------
26 // Exception
27
28 /**
29  * \ingroup Exception
30  * \brief constructor
31  * @param f
32  * @param msg  
33  */
34 Exception::Exception(const std::string &f, const std::string& msg) throw()
35 #ifdef __GNUC__
36   try
37 #endif
38   : From(f), Error(msg) {
39   }
40 #ifdef __GNUC__
41 catch(...) {
42   fatal("Exception::Exception(const std::string&, const std::string&, const std::string&)");
43 }
44 #endif
45
46
47 /**
48  * \ingroup Exception
49  * \brief fatal
50  * @param from 
51  */
52 void Exception::fatal(const char *from) throw() {
53    try
54    {
55       std::cerr << "Fatal: exception received in " << from 
56                 << " while handling exception." << std::endl;
57       exit(-1);
58    }
59    catch(...)
60    {
61       try
62       {
63          std::cerr << "Fatal: exception received in Exception::fatal while handling exception."
64                    << std::endl;
65          exit(-1);
66       }
67       catch(...)
68       {
69          exit(-1);
70       }
71    }
72 }
73
74 /**
75  * \ingroup Exception
76  * \brief getName
77  * @return string
78  */
79 std::string Exception::getName() const throw()
80 {
81    try
82    {
83 #ifdef __GNUC__   // GNU C++ compiler class name demangling
84       unsigned int nested = 1, i, nb, offset;
85       std::string one;
86
87       std::string name;
88       std::string iname = typeid(*this).name();
89       if(iname[0] == 'Q')
90       {
91          nested = iname[1] - '0';
92          iname = std::string(iname, 2, std::string::npos);
93       }
94       for(i = 0; i < nested; i++)
95       {
96          ::sscanf(iname.c_str(), "%u%n", &nb, &offset);
97          iname = std::string(iname, offset, std::string::npos);
98          name += std::string(iname, 0, nb);
99          if(i + 1 < nested) name += "::";
100          iname = std::string(iname, nb, std::string::npos);
101       }
102       return name;
103 #else           // no class name demangling
104       //name = typeid(*this).name();
105       return "Exception";
106 #endif
107   }
108   catch(...) {
109     fatal("Exception::getName(std::string &)");
110     return "";
111   }
112 }
113
114 /**
115  * \ingroup Exception
116  * \brief Exception
117  */
118  Exception::operator const char *() const throw() {
119   return getName().c_str();
120 }
121
122 //-----------------------------------------------------------------------------
123 /**
124  * \ingroup Exception
125  * \brief Exception::operator <<
126  */
127  std::ostream& operator<<(std::ostream &os, const Exception &e) {
128   try {  
129     os << "Exception " << e.getName() << " thrown: " << e.getError() << std::endl;
130   }
131   catch(...) {
132     Exception::fatal("operator<<(std::ostream &, const Exception&)");
133   }
134   return os;
135 }
136 } // end namespace gdcm
137 //-----------------------------------------------------------------------------