# Error handling

## Returned values

In most cases when SVG++ methods returns `bool` values, they can be used as an alternative to exceptions - if method returns `false`, then calling method immediately returns with `false` result and so on.

Error reporting is controlled by Error Policy. `policy::error::raise_exception` used by default throws exception objects, derived from `std::exception` and `boost::exception`. In this case only `true` may be returned as a result code.

## Default Error Handling

Default `policy::error::raise_exception` uses Boost.Exception for transporting arbitrary data to the catch site.

`boost::error_info` uses tags `tag::error_info::xml_element` and `tag::error_info::xml_attribute` to pass information about place in SVG document where error occured alongside with the exception object. Value type depends on XML parser and XML Policy used.

Example of SVG++ exception handling when RapidXML NS parser is used:

    typedef rapidxml_ns::xml_node<> const * XMLElement;

    try
    {
      /* ... */
      document_traversal</* ... */>::load_document(/* ... */);
    }
    catch(svgpp::exception_base const & e)
    {
      typedef boost::error_info<svgpp::tag::error_info::xml_element, XMLElement> element_error_info;
      std::cerr << "Error reading SVG";
      if (XMLElement const * element = boost::get_error_info<element_error_info>(e))
        std::cerr
          << " in element '"
          << std::string((*element)->name(), (*element)->name() + (*element)->name_size())
          << "'";
      std::cerr << ": " << e.what() << "\n";
    }

## Error Policy Concept

    struct error_policy
    {
      typedef /* ... */ context_type;

      template<class XMLElement, class ElementName>
      static bool unknown_element(
        context_type const &,
        XMLElement const & element,
        ElementName const & name);

      template<class XMLAttributesIterator, class AttributeName>
      static bool unknown_attribute(context_type &,
        XMLAttributesIterator const & attribute,
        AttributeName const & name,
        BOOST_SCOPED_ENUM(detail::namespace_id) namespace_id,
        tag::source::attribute);

      template<class XMLAttributesIterator, class AttributeName>
      static bool unknown_attribute(context_type &,
        XMLAttributesIterator const & attribute,
        AttributeName const & name,
        tag::source::css);

      static bool unexpected_attribute(context_type &,
        detail::attribute_id id, tag::source::attribute);

      template<class AttributeTag>
      static bool required_attribute_not_found(context_type &, AttributeTag);

      template<class AttributeTag, class AttributeValue>
      static bool parse_failed(context_type &, AttributeTag,
        AttributeValue const & value);

      template<class XMLElement>
      static bool unexpected_element(context_type &, XMLElement const & element);

      template<class AttributeTag>
      static bool negative_value(context_type &, AttributeTag);

      typedef /* ... */ intercepted_exception_type;

      template<class XMLElement>
      static bool add_element_info(intercepted_exception_type & e,
        XMLElement const & element);
    };

If Error Policy method returns `true`, then SVG++ continues SVG processing skipping the part with the error. In some cases it may lead to problems in further processing.

If method returns `false`, then processing immediately stops.