Salome HOME
b9c498c0338ce36d323293a2a227d22d45a88ec1
[modules/kernel.git] / src / DSC / DSC_User / DSC_Exception.hxx
1 // Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  File   : DSC_Exception.hxx
24 //  Author : Eric Fayolle (EDF)
25 //  Module : KERNEL
26 //
27 #ifndef DSC_EXCEPTION_HXX
28 #define DSC_EXCEPTION_HXX
29
30 #include "Utils_SALOME_Exception.hxx"
31 #include <string>
32 #include <iostream>
33 #include <sstream>
34 #include <memory>
35
36 #include "utilities.h"
37
38 #ifndef WIN32
39 extern "C"
40 {
41 #endif
42 #include <string.h>
43 #ifndef WIN32
44 }
45 #endif
46
47
48 #if defined(_DEBUG_) || defined(_DEBUG)
49 # ifdef __GNUC__
50 #  define LOC(message) (message), __FILE__ , __LINE__ , __FUNCTION__
51 # else
52 #  define LOC(message) (message), __FILE__, __LINE__
53 # endif
54 #else
55 # define LOC(message)  (message)
56 #endif
57
58
59 #ifndef SWIG
60 /**
61  * Class OSS is useful when streaming data through a function
62  * that expect a string as parameter
63  */
64 class OSS
65 {
66 private:
67   std::ostringstream oss_;
68
69 public:
70   explicit OSS() : oss_() {}
71
72   template <class T>
73   OSS & operator<<(T obj)
74   {
75     oss_ << obj;
76     return *this;
77   }
78
79   operator std::string()
80   {
81     return oss_.str();
82   }
83
84   // Surtout ne pas écrire le code suivant:
85   // car oss_.str() renvoie une string temporaire
86   //   operator const char*()
87   //   {
88   //     return oss_.str().c_str();
89   //   }
90
91 }; /* end class OSS */
92 #endif
93
94
95 // Cette fonction provient de Utils_SALOME_Exception
96 // Solution pas très élégante mais contrainte par les manques de la classe SALOME_Exception
97 const char *makeText( const char *text, const char *fileName, const unsigned int lineNumber);
98
99 struct DSC_Exception : public SALOME_Exception {
100
101   // Attention, en cas de modification des paramètres par défaut
102   // il est necessaire de les repporter dans la macro DSC_EXCEPTION ci-dessous
103   // Le constructeur de la SALOME_Exception demande une chaine non vide
104   // Du coup on est obliger de la désallouer avant d'y mettre la notre
105   // car le what n'est pas virtuel donc il faut que le contenu de SALOME_Exception::_text
106   // soit utilisable.
107   // Ne pas mettre lineNumber=0 à cause du calcul log dans la SALOME_Exception si fileName est défini
108   DSC_Exception( const std::string & text, 
109                  const char *fileName="", 
110                  const unsigned int lineNumber=0, 
111                  const char *funcName="" ):
112     SALOME_Exception(text.c_str()) ,
113     _dscText(text),
114     _filefuncName(setFileFuncName(fileName?fileName:"",funcName?funcName:"")),
115     _lineNumber(lineNumber),
116     _exceptionName("DSC_Exception")
117   {
118     // Mise en cohérence avec l'exception SALOME (à revoir)
119     delete [] ((char*)SALOME_Exception::_text);
120     if (! _filefuncName.empty() )
121       SALOME_Exception::_text = makeText(text.c_str(),_filefuncName.c_str(),lineNumber) ;
122     else
123       SALOME_Exception::_text = makeText(text.c_str(),0,lineNumber) ;
124     
125     OSS oss ;
126     oss << _exceptionName ;
127     if (!_filefuncName.empty() ) oss << " in " << _filefuncName;
128     if (_lineNumber) oss << " [" << _lineNumber << "]";
129     oss << " : " << _dscText;
130     _what = oss;
131   }
132
133   virtual const char* what( void ) const noexcept 
134   {
135     return _what.c_str()  ;
136   }
137
138   // L'opérateur = de SALOME_Exception n'est pas défini
139   // problème potentiel concernant la recopie de son pointeur _text
140     
141   // Le destructeur de la SALOME_Exception devrait être virtuel
142   // sinon pb avec nos attributs de type pointeur.
143   virtual ~DSC_Exception(void) noexcept {};
144
145   virtual const std::string & getExceptionName() const {return _exceptionName;};
146
147 private:
148
149   std::string setFileFuncName(const char * fileName, const char * funcName) {
150     ASSERT(fileName);
151     ASSERT(funcName);
152     OSS oss;
153     if ( strcmp(fileName,"") )
154       oss << fileName << "##" << funcName;
155   
156     return oss;
157   };
158
159   //DSC_Exception(void) {};
160 protected:
161   std::string  _dscText;
162   std::string  _filefuncName;
163   int          _lineNumber;
164   std::string  _exceptionName;
165   std::string  _what;
166 };
167
168 #define DSC_EXCEPTION(Derived) struct Derived : public DSC_Exception { \
169   Derived ( const std::string & text, const char *fileName="", const unsigned int lineNumber=0, const char *funcName="" \
170             ) : DSC_Exception(text,fileName,lineNumber,funcName) {      \
171     _exceptionName = #Derived; \
172   } \
173     virtual ~Derived(void) noexcept;\
174 };\
175
176 //Sert à eviter le problème d'identification RTTI des exceptions
177 //Crée un unique typeInfo pour tous les bibliothèques composants SALOME
178 //dans un fichier cxx
179 #define DSC_EXCEPTION_CXX(NameSpace,Derived) NameSpace::Derived::~Derived(void) noexcept {}
180
181 #endif /* DSC_EXCEPTION_HXX */