🔨 cleaner exception interface
This commit is contained in:
		
							parent
							
								
									ad47b0fbde
								
							
						
					
					
						commit
						3d4f6a2940
					
				
					 6 changed files with 73 additions and 60 deletions
				
			
		| 
						 | 
				
			
			@ -147,8 +147,7 @@ class binary_reader
 | 
			
		|||
        {
 | 
			
		||||
            // EOF
 | 
			
		||||
            case std::char_traits<char>::eof():
 | 
			
		||||
                unexpect_eof();
 | 
			
		||||
                return sax->parse_error(chars_read, "<end of file>", "unexpected end of input");
 | 
			
		||||
                return sax->parse_error(chars_read, "<end of file>", parse_error::create(110, chars_read, "unexpected end of input"));
 | 
			
		||||
 | 
			
		||||
            // Integer 0x00..0x17 (0..23)
 | 
			
		||||
            case 0x00:
 | 
			
		||||
| 
						 | 
				
			
			@ -399,7 +398,7 @@ class binary_reader
 | 
			
		|||
            {
 | 
			
		||||
                std::stringstream ss;
 | 
			
		||||
                ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current;
 | 
			
		||||
                JSON_THROW(parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str()));
 | 
			
		||||
                return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -410,8 +409,7 @@ class binary_reader
 | 
			
		|||
        {
 | 
			
		||||
            // EOF
 | 
			
		||||
            case std::char_traits<char>::eof():
 | 
			
		||||
                unexpect_eof();
 | 
			
		||||
                return sax->parse_error(chars_read, "<end of file>", "unexpected end of input");
 | 
			
		||||
                return sax->parse_error(chars_read, "<end of file>", parse_error::create(110, chars_read, "unexpected end of input"));
 | 
			
		||||
 | 
			
		||||
            // positive fixint
 | 
			
		||||
            case 0x00:
 | 
			
		||||
| 
						 | 
				
			
			@ -712,8 +710,7 @@ class binary_reader
 | 
			
		|||
            {
 | 
			
		||||
                std::stringstream ss;
 | 
			
		||||
                ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current;
 | 
			
		||||
                JSON_THROW(parse_error::create(112, chars_read,
 | 
			
		||||
                                               "error reading MessagePack; last byte: 0x" + ss.str()));
 | 
			
		||||
                return sax->parse_error(chars_read, ss.str(), parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + ss.str()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1189,8 +1186,7 @@ class binary_reader
 | 
			
		|||
        switch (prefix)
 | 
			
		||||
        {
 | 
			
		||||
            case std::char_traits<char>::eof():  // EOF
 | 
			
		||||
                unexpect_eof();
 | 
			
		||||
                return sax->parse_error(chars_read, "<end of file>", "unexpected end of input");
 | 
			
		||||
                return sax->parse_error(chars_read, "<end of file>", parse_error::create(110, chars_read, "unexpected end of input"));
 | 
			
		||||
 | 
			
		||||
            case 'T':  // true
 | 
			
		||||
                return sax->boolean(true);
 | 
			
		||||
| 
						 | 
				
			
			@ -1223,8 +1219,7 @@ class binary_reader
 | 
			
		|||
                {
 | 
			
		||||
                    std::stringstream ss;
 | 
			
		||||
                    ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current;
 | 
			
		||||
                    JSON_THROW(parse_error::create(113, chars_read,
 | 
			
		||||
                                                   "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str()));
 | 
			
		||||
                    return sax->parse_error(chars_read, ss.str(), parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str()));
 | 
			
		||||
                }
 | 
			
		||||
                return sax->string(string_t(1, static_cast<char>(current)));
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,8 @@
 | 
			
		|||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <nlohmann/detail/exceptions.hpp>
 | 
			
		||||
 | 
			
		||||
namespace nlohmann
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +120,7 @@ struct json_sax
 | 
			
		|||
    */
 | 
			
		||||
    virtual bool parse_error(std::size_t position,
 | 
			
		||||
                             const std::string& last_token,
 | 
			
		||||
                             const std::string& error_msg) = 0;
 | 
			
		||||
                             const detail::exception& ex) = 0;
 | 
			
		||||
 | 
			
		||||
    virtual ~json_sax() = default;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -224,19 +226,27 @@ class json_sax_dom_parser : public json_sax<BasicJsonType>
 | 
			
		|||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool parse_error(std::size_t position, const std::string& token,
 | 
			
		||||
                     const std::string& error_msg) override
 | 
			
		||||
    bool parse_error(std::size_t, const std::string&,
 | 
			
		||||
                     const detail::exception& ex) override
 | 
			
		||||
    {
 | 
			
		||||
        errored = true;
 | 
			
		||||
        if (allow_exceptions)
 | 
			
		||||
        {
 | 
			
		||||
            if (error_msg == "number overflow")
 | 
			
		||||
            // determine the proper exception type from the id
 | 
			
		||||
            switch ((ex.id / 100) % 100)
 | 
			
		||||
            {
 | 
			
		||||
                JSON_THROW(BasicJsonType::out_of_range::create(406, "number overflow parsing '" + token + "'"));
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                JSON_THROW(BasicJsonType::parse_error::create(101, position, error_msg));
 | 
			
		||||
                case 1:
 | 
			
		||||
                    JSON_THROW(*reinterpret_cast<const detail::parse_error*>(&ex));
 | 
			
		||||
                case 2:
 | 
			
		||||
                    JSON_THROW(*reinterpret_cast<const detail::invalid_iterator*>(&ex));
 | 
			
		||||
                case 3:
 | 
			
		||||
                    JSON_THROW(*reinterpret_cast<const detail::type_error*>(&ex));
 | 
			
		||||
                case 4:
 | 
			
		||||
                    JSON_THROW(*reinterpret_cast<const detail::out_of_range*>(&ex));
 | 
			
		||||
                case 5:
 | 
			
		||||
                    JSON_THROW(*reinterpret_cast<const detail::other_error*>(&ex));
 | 
			
		||||
                default:
 | 
			
		||||
                    assert(false);  // LCOV_EXCL_LINE
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -359,7 +369,7 @@ class json_sax_acceptor : public json_sax<BasicJsonType>
 | 
			
		|||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool parse_error(std::size_t, const std::string&, const std::string&) override
 | 
			
		||||
    bool parse_error(std::size_t, const std::string&, const detail::exception&) override
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ class parser
 | 
			
		|||
            {
 | 
			
		||||
                sdp.parse_error(m_lexer.get_position(),
 | 
			
		||||
                                m_lexer.get_token_string(),
 | 
			
		||||
                                exception_message(token_type::end_of_input));
 | 
			
		||||
                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input)));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // in case of an error, return discarded value
 | 
			
		||||
| 
						 | 
				
			
			@ -456,7 +456,7 @@ class parser
 | 
			
		|||
                    {
 | 
			
		||||
                        return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                                m_lexer.get_token_string(),
 | 
			
		||||
                                                exception_message(token_type::value_string));
 | 
			
		||||
                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string)));
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -472,7 +472,7 @@ class parser
 | 
			
		|||
                    {
 | 
			
		||||
                        return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                                m_lexer.get_token_string(),
 | 
			
		||||
                                                exception_message(token_type::name_separator));
 | 
			
		||||
                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator)));
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // parse value
 | 
			
		||||
| 
						 | 
				
			
			@ -499,7 +499,8 @@ class parser
 | 
			
		|||
                    {
 | 
			
		||||
                        return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                                m_lexer.get_token_string(),
 | 
			
		||||
                                                exception_message(token_type::end_object));
 | 
			
		||||
                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object)));
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -546,7 +547,7 @@ class parser
 | 
			
		|||
                    {
 | 
			
		||||
                        return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                                m_lexer.get_token_string(),
 | 
			
		||||
                                                exception_message(token_type::end_array));
 | 
			
		||||
                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array)));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -559,7 +560,7 @@ class parser
 | 
			
		|||
                {
 | 
			
		||||
                    return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                            m_lexer.get_token_string(),
 | 
			
		||||
                                            "number overflow");
 | 
			
		||||
                                            out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'"));
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -602,14 +603,14 @@ class parser
 | 
			
		|||
                // using "uninitialized" to avoid "expected" message
 | 
			
		||||
                return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                        m_lexer.get_token_string(),
 | 
			
		||||
                                        exception_message(token_type::uninitialized));
 | 
			
		||||
                                        parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized)));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            default: // the last token was unexpected
 | 
			
		||||
            {
 | 
			
		||||
                return sax->parse_error(m_lexer.get_position(),
 | 
			
		||||
                                        m_lexer.get_token_string(),
 | 
			
		||||
                                        exception_message(token_type::literal_or_value));
 | 
			
		||||
                                        parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value)));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue