1 // File: Standard_Failure.cxx
2 // Copyright: Open Cascade 2006
4 #include <Standard_ErrorHandler.hxx>
5 #include <Standard_Failure.ixx>
6 #include <Standard_TypeMismatch.hxx>
7 #include <Standard_Type.hxx>
8 #include <Standard_Macro.hxx>
10 #include <Standard_PCharacter.hxx>
12 static Standard_CString allocate_message(const Standard_CString AString)
14 Standard_CString aStr = 0;
16 const Standard_Size aLen = strlen(AString);
17 aStr = new Standard_Character[aLen+sizeof(Standard_Integer)+1];
18 Standard_PCharacter pStr=(Standard_PCharacter)aStr;
19 strcpy(pStr+sizeof(Standard_Integer),AString);
20 *((Standard_Integer*)aStr) = 1;
26 static Standard_CString copy_message(Standard_CString aMessage)
28 Standard_CString aStr = 0;
31 (*((Standard_Integer*)aStr))++;
36 static void deallocate_message(Standard_CString aMessage)
39 (*((Standard_Integer*)aMessage))--;
40 if(*((Standard_Integer*)aMessage)==0)
41 delete [](Standard_PCharacter)aMessage;
46 // ******************************************************************
48 // ******************************************************************
49 #ifndef NO_CXX_EXCEPTION
50 static Handle(Standard_Failure) RaisedError;
52 // ------------------------------------------------------------------
54 // ------------------------------------------------------------------
55 Standard_Failure::Standard_Failure ()
60 // ------------------------------------------------------------------
61 // Create returns mutable Failure;
62 // ------------------------------------------------------------------
63 Standard_Failure::Standard_Failure (const Standard_CString AString)
66 myMessage = allocate_message(AString);
69 Standard_Failure::Standard_Failure (const Standard_Failure& aFailure)
71 myMessage = copy_message(aFailure.myMessage);
74 void Standard_Failure::Destroy()
76 deallocate_message(myMessage);
79 void Standard_Failure::SetMessageString(const Standard_CString AString)
81 if ( AString == GetMessageString() ) return;
82 deallocate_message(myMessage);
83 myMessage = allocate_message(AString);
86 // ------------------------------------------------------------------
87 // Caught (myclass) returns mutable Failure raises NoSuchObject ;
88 // ------------------------------------------------------------------
89 Handle(Standard_Failure) Standard_Failure::Caught()
91 #ifdef NO_CXX_EXCEPTION
92 return Standard_ErrorHandler::LastCaughtError();
98 // ------------------------------------------------------------------
99 // Raise (myclass; aMessage: CString = "") ;
100 // ------------------------------------------------------------------
101 void Standard_Failure::Raise (const Standard_CString AString)
103 Handle(Standard_Failure) E = new Standard_Failure() ;
104 E->Reraise (AString) ;
107 // ------------------------------------------------------------------
108 // Raise(myclass; aReason: in out SStream) ;
109 // ------------------------------------------------------------------
110 void Standard_Failure::Raise (const Standard_SStream& AReason)
112 Handle(Standard_Failure) E = new Standard_Failure();
113 E->Reraise (AReason);
116 // ------------------------------------------------------------------
117 // Reraise (me: mutable; aMessage: CString) ;
118 // ------------------------------------------------------------------
119 void Standard_Failure::Reraise (const Standard_CString AString)
121 SetMessageString(AString);
125 void Standard_Failure::Reraise (const Standard_SStream& AReason)
127 #ifdef USE_STL_STREAM
128 SetMessageString(AReason.str().c_str());
130 // Note: use dirty tricks -- unavoidable with old streams
131 ((Standard_SStream&)AReason) << ends;
132 SetMessageString(((Standard_SStream&)AReason).str());
133 ((Standard_SStream&)AReason).freeze (false);
138 void Standard_Failure::Reraise ()
140 #ifdef NO_CXX_EXCEPTION
141 Standard_ErrorHandler::Error (this);
142 Standard_ErrorHandler::Abort (this);
149 void Standard_Failure::Jump() const
151 #if defined (NO_CXX_EXCEPTION) || defined (OCC_CONVERT_SIGNALS)
152 Standard_ErrorHandler::Error (this);
153 Standard_ErrorHandler::Abort (this);
161 // ------------------------------------------------------------------
162 // Throw (me) is virtual ;
163 // ------------------------------------------------------------------
164 void Standard_Failure::Throw() const
166 #ifndef NO_CXX_EXCEPTION
171 // ------------------------------------------------------------------
172 // Print (me; s: in out OStream) returns OStream;
173 // ------------------------------------------------------------------
174 void Standard_Failure::Print (Standard_OStream& AStream) const
177 AStream << DynamicType() << ": " << GetMessageString();
180 AStream << DynamicType();
184 Handle(Standard_Failure) Standard_Failure::NewInstance(const Standard_CString AString)
186 return new Standard_Failure(AString) ;