🔨 added user-defined exceptions 303-304
This commit is contained in:
parent
068c7acda9
commit
f473f74fb0
4 changed files with 84 additions and 86 deletions
29
src/json.hpp
29
src/json.hpp
|
@ -3255,7 +3255,7 @@ class basic_json
|
|||
|
||||
@tparam ThisType will be deduced as `basic_json` or `const basic_json`
|
||||
|
||||
@throw std::domain_error if ReferenceType does not match underlying value
|
||||
@throw type_error.303 if ReferenceType does not match underlying value
|
||||
type of the current JSON
|
||||
*/
|
||||
template<typename ReferenceType, typename ThisType>
|
||||
|
@ -3272,8 +3272,7 @@ class basic_json
|
|||
return *ptr;
|
||||
}
|
||||
|
||||
JSON_THROW(std::domain_error("incompatible ReferenceType for get_ref, actual type is " +
|
||||
obj.type_name()));
|
||||
JSON_THROW(type_error(303, "incompatible ReferenceType for get_ref, actual type is " + obj.type_name()));
|
||||
}
|
||||
|
||||
public:
|
||||
|
@ -3554,8 +3553,8 @@ class basic_json
|
|||
reference type @a ReferenceType fits to the JSON value; throws
|
||||
std::domain_error otherwise
|
||||
|
||||
@throw std::domain_error in case passed type @a ReferenceType is
|
||||
incompatible with the stored JSON value
|
||||
@throw type_error.303 in case passed type @a ReferenceType is incompatible
|
||||
with the stored JSON value
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
|
@ -3646,8 +3645,8 @@ class basic_json
|
|||
|
||||
@return reference to the element at index @a idx
|
||||
|
||||
@throw std::domain_error if the JSON value is not an array; example:
|
||||
`"cannot use at() with string"`
|
||||
@throw type_error.304 if the JSON value is not an array; example: `"cannot
|
||||
use at() with string"`
|
||||
@throw std::out_of_range if the index @a idx is out of range of the array;
|
||||
that is, `idx >= size()`; example: `"array index 7 is out of range"`
|
||||
|
||||
|
@ -3675,7 +3674,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3689,8 +3688,8 @@ class basic_json
|
|||
|
||||
@return const reference to the element at index @a idx
|
||||
|
||||
@throw std::domain_error if the JSON value is not an array; example:
|
||||
`"cannot use at() with string"`
|
||||
@throw type_error.304 if the JSON value is not an array; example: `"cannot
|
||||
use at() with string"`
|
||||
@throw std::out_of_range if the index @a idx is out of range of the array;
|
||||
that is, `idx >= size()`; example: `"array index 7 is out of range"`
|
||||
|
||||
|
@ -3718,7 +3717,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3732,7 +3731,7 @@ class basic_json
|
|||
|
||||
@return reference to the element at key @a key
|
||||
|
||||
@throw std::domain_error if the JSON value is not an object; example:
|
||||
@throw type_error.304 if the JSON value is not an object; example:
|
||||
`"cannot use at() with boolean"`
|
||||
@throw std::out_of_range if the key @a key is is not stored in the object;
|
||||
that is, `find(key) == end()`; example: `"key "the fast" not found"`
|
||||
|
@ -3765,7 +3764,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3779,7 +3778,7 @@ class basic_json
|
|||
|
||||
@return const reference to the element at key @a key
|
||||
|
||||
@throw std::domain_error if the JSON value is not an object; example:
|
||||
@throw type_error.304 if the JSON value is not an object; example:
|
||||
`"cannot use at() with boolean"`
|
||||
@throw std::out_of_range if the key @a key is is not stored in the object;
|
||||
that is, `find(key) == end()`; example: `"key "the fast" not found"`
|
||||
|
@ -3812,7 +3811,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3255,7 +3255,7 @@ class basic_json
|
|||
|
||||
@tparam ThisType will be deduced as `basic_json` or `const basic_json`
|
||||
|
||||
@throw std::domain_error if ReferenceType does not match underlying value
|
||||
@throw type_error.303 if ReferenceType does not match underlying value
|
||||
type of the current JSON
|
||||
*/
|
||||
template<typename ReferenceType, typename ThisType>
|
||||
|
@ -3272,8 +3272,7 @@ class basic_json
|
|||
return *ptr;
|
||||
}
|
||||
|
||||
JSON_THROW(std::domain_error("incompatible ReferenceType for get_ref, actual type is " +
|
||||
obj.type_name()));
|
||||
JSON_THROW(type_error(303, "incompatible ReferenceType for get_ref, actual type is " + obj.type_name()));
|
||||
}
|
||||
|
||||
public:
|
||||
|
@ -3554,8 +3553,8 @@ class basic_json
|
|||
reference type @a ReferenceType fits to the JSON value; throws
|
||||
std::domain_error otherwise
|
||||
|
||||
@throw std::domain_error in case passed type @a ReferenceType is
|
||||
incompatible with the stored JSON value
|
||||
@throw type_error.303 in case passed type @a ReferenceType is incompatible
|
||||
with the stored JSON value
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
|
@ -3646,8 +3645,8 @@ class basic_json
|
|||
|
||||
@return reference to the element at index @a idx
|
||||
|
||||
@throw std::domain_error if the JSON value is not an array; example:
|
||||
`"cannot use at() with string"`
|
||||
@throw type_error.304 if the JSON value is not an array; example: `"cannot
|
||||
use at() with string"`
|
||||
@throw std::out_of_range if the index @a idx is out of range of the array;
|
||||
that is, `idx >= size()`; example: `"array index 7 is out of range"`
|
||||
|
||||
|
@ -3675,7 +3674,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3689,8 +3688,8 @@ class basic_json
|
|||
|
||||
@return const reference to the element at index @a idx
|
||||
|
||||
@throw std::domain_error if the JSON value is not an array; example:
|
||||
`"cannot use at() with string"`
|
||||
@throw type_error.304 if the JSON value is not an array; example: `"cannot
|
||||
use at() with string"`
|
||||
@throw std::out_of_range if the index @a idx is out of range of the array;
|
||||
that is, `idx >= size()`; example: `"array index 7 is out of range"`
|
||||
|
||||
|
@ -3718,7 +3717,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3732,7 +3731,7 @@ class basic_json
|
|||
|
||||
@return reference to the element at key @a key
|
||||
|
||||
@throw std::domain_error if the JSON value is not an object; example:
|
||||
@throw type_error.304 if the JSON value is not an object; example:
|
||||
`"cannot use at() with boolean"`
|
||||
@throw std::out_of_range if the key @a key is is not stored in the object;
|
||||
that is, `find(key) == end()`; example: `"key "the fast" not found"`
|
||||
|
@ -3765,7 +3764,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3779,7 +3778,7 @@ class basic_json
|
|||
|
||||
@return const reference to the element at key @a key
|
||||
|
||||
@throw std::domain_error if the JSON value is not an object; example:
|
||||
@throw type_error.304 if the JSON value is not an object; example:
|
||||
`"cannot use at() with boolean"`
|
||||
@throw std::out_of_range if the key @a key is is not stored in the object;
|
||||
that is, `find(key) == end()`; example: `"key "the fast" not found"`
|
||||
|
@ -3812,7 +3811,7 @@ class basic_json
|
|||
}
|
||||
else
|
||||
{
|
||||
JSON_THROW(std::domain_error("cannot use at() with " + type_name()));
|
||||
JSON_THROW(type_error(304, "cannot use at() with " + type_name()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -76,77 +76,77 @@ TEST_CASE("element access 1")
|
|||
{
|
||||
json j_nonarray(json::value_t::null);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with null");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with null");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with null");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with null");
|
||||
}
|
||||
|
||||
SECTION("boolean")
|
||||
{
|
||||
json j_nonarray(json::value_t::boolean);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with boolean");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with boolean");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with boolean");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with boolean");
|
||||
}
|
||||
|
||||
SECTION("string")
|
||||
{
|
||||
json j_nonarray(json::value_t::string);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with string");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with string");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with string");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with string");
|
||||
}
|
||||
|
||||
SECTION("object")
|
||||
{
|
||||
json j_nonarray(json::value_t::object);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with object");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with object");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with object");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with object");
|
||||
}
|
||||
|
||||
SECTION("number (integer)")
|
||||
{
|
||||
json j_nonarray(json::value_t::number_integer);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with number");
|
||||
}
|
||||
|
||||
SECTION("number (unsigned)")
|
||||
{
|
||||
json j_nonarray(json::value_t::number_unsigned);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with number");
|
||||
}
|
||||
|
||||
SECTION("number (floating-point)")
|
||||
{
|
||||
json j_nonarray(json::value_t::number_float);
|
||||
const json j_nonarray_const(j_nonarray);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonarray.at(0), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonarray_const.at(0), json::type_error);
|
||||
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray.at(0), "[json.exception.type_error.304] cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonarray_const.at(0), "[json.exception.type_error.304] cannot use at() with number");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -75,70 +75,70 @@ TEST_CASE("element access 2")
|
|||
{
|
||||
json j_nonobject(json::value_t::null);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with null");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with null");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with null");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with null");
|
||||
}
|
||||
|
||||
SECTION("boolean")
|
||||
{
|
||||
json j_nonobject(json::value_t::boolean);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with boolean");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with boolean");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with boolean");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with boolean");
|
||||
}
|
||||
|
||||
SECTION("string")
|
||||
{
|
||||
json j_nonobject(json::value_t::string);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with string");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with string");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with string");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with string");
|
||||
}
|
||||
|
||||
SECTION("array")
|
||||
{
|
||||
json j_nonobject(json::value_t::array);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with array");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with array");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with array");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with array");
|
||||
}
|
||||
|
||||
SECTION("number (integer)")
|
||||
{
|
||||
json j_nonobject(json::value_t::number_integer);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with number");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with number");
|
||||
}
|
||||
|
||||
SECTION("number (unsigned)")
|
||||
{
|
||||
json j_nonobject(json::value_t::number_unsigned);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with number");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with number");
|
||||
}
|
||||
|
||||
SECTION("number (floating-point)")
|
||||
{
|
||||
json j_nonobject(json::value_t::number_float);
|
||||
const json j_nonobject_const(j_nonobject);
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), std::domain_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "cannot use at() with number");
|
||||
CHECK_THROWS_AS(j_nonobject.at("foo"), json::type_error);
|
||||
CHECK_THROWS_AS(j_nonobject_const.at("foo"), json::type_error);
|
||||
CHECK_THROWS_WITH(j_nonobject.at("foo"), "[json.exception.type_error.304] cannot use at() with number");
|
||||
CHECK_THROWS_WITH(j_nonobject_const.at("foo"), "[json.exception.type_error.304] cannot use at() with number");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue