diff --git a/src/json.hpp b/src/json.hpp index ffe64d1a..f1462db8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -52,7 +52,6 @@ SOFTWARE. #include // addressof, allocator, allocator_traits, unique_ptr #include // accumulate #include // stringstream -#include // domain_error, invalid_argument, out_of_range #include // getline, stoi, string, to_string #include // add_pointer, conditional, decay, enable_if, false_type, integral_constant, is_arithmetic, is_base_of, is_const, is_constructible, is_convertible, is_default_constructible, is_enum, is_floating_point, is_integral, is_nothrow_move_assignable, is_nothrow_move_constructible, is_pointer, is_reference, is_same, is_scalar, is_signed, remove_const, remove_cv, remove_pointer, remove_reference, true_type, underlying_type #include // declval, forward, make_pair, move, pair, swap @@ -295,6 +294,26 @@ class out_of_range : public exception {} }; +/*! +@brief exception indicating other errors + +Exceptions have ids 5xx. + +name / id | example massage | description +------------------------------ | --------------- | ------------------------- +json.exception.[other_error](@ref other_error).501 | "unsuccessful" | A JSON Patch operation 'test' failed. + +@since version 3.0.0 +*/ +class other_error : public exception +{ + public: + other_error(int id_, const std::string& what_arg_) + : exception(id_, "other_error", what_arg_) + {} +}; + + /////////////////////////// // JSON type enumeration // @@ -1240,12 +1259,6 @@ class basic_json /// Classes to implement user-defined exceptions. /// @{ - /* - name / id | example massage | description - ------------------------------ | --------------- | ------------------------- - json.exception.other.500 | "unsuccessful" | A JSON Patch operation 'test' failed. - */ - /// @copydoc detail::parse_error using parse_error = detail::parse_error; /// @copydoc detail::invalid_iterator @@ -1254,6 +1267,8 @@ class basic_json using type_error = detail::type_error; /// @copydoc detail::out_of_range using out_of_range = detail::out_of_range; + /// @copydoc detail::other_error + using other_error = detail::other_error; /// @} @@ -1948,7 +1963,7 @@ class basic_json { if (t == value_t::null) { - JSON_THROW(std::domain_error("961c151d2e87f2686a955a9be24d316f1362bf21 2.1.1")); // LCOV_EXCL_LINE + JSON_THROW(other_error(500, "961c151d2e87f2686a955a9be24d316f1362bf21 2.1.1")); // LCOV_EXCL_LINE } break; } @@ -7374,11 +7389,8 @@ class basic_json template static T get_from_vector(const std::vector& vec, const size_t current_index) { + // check if we can read sizeof(T) bytes starting the next index check_length(vec.size(), sizeof(T), current_index + 1); - //if (current_index + sizeof(T) + 1 > vec.size()) - //{ - // JSON_THROW(parse_error(110, current_index + 1, "cannot read " + std::to_string(sizeof(T)) + " bytes from vector")); - //} T result; auto* ptr = reinterpret_cast(&result); @@ -13062,7 +13074,7 @@ basic_json_parser_74: // throw an exception if test fails if (not success) { - JSON_THROW(std::domain_error("unsuccessful: " + val.dump())); + JSON_THROW(other_error(501, "unsuccessful: " + val.dump())); } break; diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 300a6219..3044cf6b 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -52,7 +52,6 @@ SOFTWARE. #include // addressof, allocator, allocator_traits, unique_ptr #include // accumulate #include // stringstream -#include // domain_error, invalid_argument, out_of_range #include // getline, stoi, string, to_string #include // add_pointer, conditional, decay, enable_if, false_type, integral_constant, is_arithmetic, is_base_of, is_const, is_constructible, is_convertible, is_default_constructible, is_enum, is_floating_point, is_integral, is_nothrow_move_assignable, is_nothrow_move_constructible, is_pointer, is_reference, is_same, is_scalar, is_signed, remove_const, remove_cv, remove_pointer, remove_reference, true_type, underlying_type #include // declval, forward, make_pair, move, pair, swap @@ -295,6 +294,27 @@ class out_of_range : public exception {} }; +/*! +@brief exception indicating other errors + +Exceptions have ids 5xx. + +name / id | example massage | description +------------------------------ | --------------- | ------------------------- +json.exception.[other_error](@ref other_error).501 | "unsuccessful: {"op":"test","path":"/baz", + "value":"bar"}" | A JSON Patch operation 'test' failed. + +@since version 3.0.0 +*/ +class other_error : public exception +{ + public: + other_error(int id_, const std::string& what_arg_) + : exception(id_, "other_error", what_arg_) + {} +}; + + /////////////////////////// // JSON type enumeration // @@ -1240,12 +1260,6 @@ class basic_json /// Classes to implement user-defined exceptions. /// @{ - /* - name / id | example massage | description - ------------------------------ | --------------- | ------------------------- - json.exception.other.500 | "unsuccessful" | A JSON Patch operation 'test' failed. - */ - /// @copydoc detail::parse_error using parse_error = detail::parse_error; /// @copydoc detail::invalid_iterator @@ -1254,6 +1268,8 @@ class basic_json using type_error = detail::type_error; /// @copydoc detail::out_of_range using out_of_range = detail::out_of_range; + /// @copydoc detail::other_error + using other_error = detail::other_error; /// @} @@ -1948,7 +1964,7 @@ class basic_json { if (t == value_t::null) { - JSON_THROW(std::domain_error("961c151d2e87f2686a955a9be24d316f1362bf21 2.1.1")); // LCOV_EXCL_LINE + JSON_THROW(other_error(500, "961c151d2e87f2686a955a9be24d316f1362bf21 2.1.1")); // LCOV_EXCL_LINE } break; } @@ -12092,7 +12108,7 @@ class basic_json // throw an exception if test fails if (not success) { - JSON_THROW(std::domain_error("unsuccessful: " + val.dump())); + JSON_THROW(other_error(501, "unsuccessful: " + val.dump())); } break; diff --git a/test/src/unit-json_patch.cpp b/test/src/unit-json_patch.cpp index c021450b..9ab86ea4 100644 --- a/test/src/unit-json_patch.cpp +++ b/test/src/unit-json_patch.cpp @@ -337,8 +337,8 @@ TEST_CASE("JSON patch") )"_json; // check that evaluation throws - CHECK_THROWS_AS(doc.patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), json::other_error); + CHECK_THROWS_WITH(doc.patch(patch), "[json.exception.other_error.501] unsuccessful: " + patch[0].dump()); } SECTION("A.10. Adding a Nested Member Object") @@ -478,8 +478,8 @@ TEST_CASE("JSON patch") )"_json; // check that evaluation throws - CHECK_THROWS_AS(doc.patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), json::other_error); + CHECK_THROWS_WITH(doc.patch(patch), "[json.exception.other_error.501] unsuccessful: " + patch[0].dump()); } SECTION("A.16. Adding an Array Value") @@ -1177,8 +1177,8 @@ TEST_CASE("JSON patch") )"_json; // the test will fail - CHECK_THROWS_AS(doc.patch(patch), std::domain_error); - CHECK_THROWS_WITH(doc.patch(patch), "unsuccessful: " + patch[0].dump()); + CHECK_THROWS_AS(doc.patch(patch), json::other_error); + CHECK_THROWS_WITH(doc.patch(patch), "[json.exception.other_error.501] unsuccessful: " + patch[0].dump()); } } }