Runtime/LogicError and throwers
diff --git a/include/json/value.h b/include/json/value.h
index 1cd6291..b590825 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -35,15 +35,20 @@
/** Base class for all exceptions we throw.
*/
-class Exception : public std::exception {
-public:
- Exception(std::string const& msg);
- virtual ~Exception() throw();
- virtual char const* what() const throw();
-protected:
- std::string const& msg_;
- void* future_use_;
-};
+class JSON_API Exception;
+/** Exceptions which the user cannot easily avoid.
+ *
+ * E.g. out-of-memory, stack-overflow, malicious input
+ */
+class JSON_API RuntimeError;
+/** Exceptions throw by JSON_ASSERT/JSON_FAIL macros.
+ *
+ * These are precondition-violations (user bugs) and internal errors (our bugs).
+ */
+class JSON_API LogicError;
+
+JSON_API void throwRuntimeError(std::string const& msg);
+JSON_API void throwLogicError(std::string const& msg);
/** \brief Type of the value held by a Value object.
*/
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index f7d2cde..a71b0c1 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -152,17 +152,46 @@
namespace Json {
+class JSON_API Exception : public std::exception {
+public:
+ Exception(std::string const& msg);
+ virtual ~Exception() throw();
+ virtual char const* what() const throw();
+protected:
+ std::string const& msg_;
+};
+class JSON_API RuntimeError : public Exception {
+public:
+ RuntimeError(std::string const& msg);
+};
+class JSON_API LogicError : public Exception {
+public:
+ LogicError(std::string const& msg);
+};
+
Exception::Exception(std::string const& msg)
: msg_(msg)
- , future_use_(NULL)
-{
-}
+{}
Exception::~Exception() throw()
{}
char const* Exception::what() const throw()
{
return msg_.c_str();
}
+RuntimeError::RuntimeError(std::string const& msg)
+ : Exception(msg)
+{}
+LogicError::LogicError(std::string const& msg)
+ : Exception(msg)
+{}
+void throwRuntimeError(std::string const& msg)
+{
+ throw RuntimeError(msg);
+}
+void throwLogicError(std::string const& msg)
+{
+ throw LogicError(msg);
+}
// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////