5 #ifndef STREAMBASE_EXCEPTIONS_H
6 #define STREAMBASE_EXCEPTIONS_H
8 #include "StreamBase.hpp"
12 #include <streambase/impl/Memory.hpp>
16 #include <NMSTL/internal.hpp>
18 SB_INTERNAL_FWD(XMLExceptionBuilder);
19 SB_INTERNAL_FWD(Errors);
20 SB_INTERNAL_FWD(StackTrace);
24 #include "ExceptionCodes.hpp"
26 #define SB_Throw(x) do { \
27 x.file(__FILE__).line(__LINE__).function(__FUNCTION__).throwMyself(); \
28 NMSTL_ASSERT_UNREACHABLE(); \
52 sb_internal::Errors::Type error_type = sb_internal::Errors::UNKNOWNTYPE,
53 std::string type =
"StreamBaseException");
63 sb_internal::Errors::Type error_type = sb_internal::Errors::UNKNOWNTYPE,
64 std::string type =
"StreamBaseException");
69 static StreamBaseException fromXmlString(
const std::string &xmlstring, std::shared_ptr<StreamBaseException> cause = std::shared_ptr<StreamBaseException>());
78 virtual const char *
what()
const throw() {
return _message.c_str(); }
82 std::string getMessage()
const {
return _message; }
83 std::string getSummary()
const {
return _summary.empty() ? _message : _summary; }
87 std::string getFile()
const {
return _file; }
88 unsigned int getLine()
const {
return _line; }
89 std::string getFunction()
const {
return _function; }
93 std::string getType()
const {
return _type; }
97 sb_internal::Errors::Type getErrorType()
const {
return _error_type; }
100 std::string as_string()
const;
104 std::string getStackTrace()
const;
107 StreamBaseException *findByType(
const std::string type);
109 StreamBaseException& getDeepest();
112 virtual std::string asXmlStringSingle()
const;
113 virtual std::string asXmlString()
const;
114 virtual std::string chainAsString()
const;
115 virtual std::string linkAsString()
const;
116 virtual std::string getChainOfMessages()
const;
118 std::string getCode()
const {
return _code; }
119 StreamBaseException& getCause()
const {
return *_cause; }
120 bool hasCause()
const {
return _cause.get() != NULL; }
122 const std::string getParam(
const std::string name)
const;
124 const std::string getBoxParam()
const;
125 const std::string getBoxName()
const;
126 const std::string getFieldName()
const;
128 StreamBaseException& param(
const std::string name,
const std::string val);
129 StreamBaseException& param(
const std::string name,
int val);
130 StreamBaseException& code(std::string val);
131 StreamBaseException& code(
int val);
132 StreamBaseException& file(
const char *val);
133 StreamBaseException& file(std::string val);
134 StreamBaseException& line(
int val);
135 StreamBaseException&
function(
const char *val);
136 StreamBaseException&
function(std::string val);
137 StreamBaseException& type(std::string val);
138 StreamBaseException& message(std::string val);
139 StreamBaseException& cause(
const StreamBaseException& val);
141 StreamBaseException& summary(std::string val);
144 StreamBaseException& boxparam(std::string name);
145 StreamBaseException& boxname(std::string name);
146 StreamBaseException& fieldname(std::string name);
148 virtual void throwMyself();
152 virtual std::string causeAsXmlString()
const;
154 struct StackTraceHolder {
155 std::shared_ptr<sb_internal::StackTrace> _trace;
156 StackTraceHolder(
const std::shared_ptr<sb_internal::StackTrace>&);
157 StackTraceHolder(
const StackTraceHolder&);
158 StackTraceHolder& operator = (
const StackTraceHolder&);
162 std::string _message;
165 std::string _function;
167 StackTraceHolder _trace;
168 sb_internal::Errors::Type _error_type;
169 std::map<std::string,std::string> _params;
171 std::string _summary;
172 std::shared_ptr <StreamBaseException> _cause;
173 std::string _xmlNodeLocation;
174 friend class sb_internal::XMLExceptionBuilder;
178 #define STREAMBASE_EXCEPTION_SUBTYPE(cl, parent, error_type) class cl : public parent {};
181 #define STREAMBASE_EXCEPTION_SUBTYPE(cl, parent, error_type) \
182 class cl : public parent { \
184 cl(std::string code, std::string message, sb_internal::Errors::Type a_error_type=error_type, const char *type=#cl) : \
185 parent(code, message, a_error_type, type ? type : #cl) {} \
186 cl(std::string code, std::string message, StreamBaseException& c, sb_internal::Errors::Type a_error_type=error_type, const char *type=#cl) : \
187 parent(code, message, c, a_error_type, type ? type : #cl) {} \
188 void throwMyself() { throw(*this); }; \
191 #endif // DOXYGEN_SKIP
193 #define STREAMBASE_EXCEPTION_TYPE(cl, error_type) \
194 STREAMBASE_EXCEPTION_SUBTYPE(cl, StreamBaseException, error_type)
238 sb_internal::Errors::Type error_type = sb_internal::Errors::UNKNOWNTYPE,
239 std::string type =
"StreamBaseXmlRpcFault");
242 sb_internal::Errors::Type error_type = sb_internal::Errors::UNKNOWNTYPE,
243 std::string type =
"StreamBaseXmlRpcFault");
247 void throwMyself() {
throw(*
this); }
254 std::vector<StreamBaseException> causes;
256 virtual std::string causeAsXmlString()
const;
259 sb_internal::Errors::Type error_type = sb_internal::Errors::UNKNOWNTYPE,
260 std::string type =
"StreamBaseListException");
264 const std::vector<StreamBaseException> &getCauses()
const {
return causes; }
265 std::string getChainOfMessages()
const;
266 std::string chainAsString()
const;
269 void throwMyself() {
throw(*
this); }