Reputation: 1712
RapidXml throws an exception in case of an invalid XML file. Is it possible to recover from such a failure?
For example, is it possible to check if the XML is valid beforehand, or recover and continue on?
It seems that when such failures happen, there is only assert and exit of process, and no chance for recovery.
Upvotes: 4
Views: 3887
Reputation: 4052
By default, RapidXML raises exceptions on parse errors; it doesn't assert (perhaps by assert you just meant the process aborts).
It is possible to configure RapidXML with your own error handler called rapidxml::parse_error_handler
if you #define RAPIDXML_NO_EXCEPTIONS
before including the RapidXML headers, and if such an error handler returns, RapidXML will call assert(0)
, but I suspect that you don't have that enabled and you just need to be catching the right exception.
There's just one exception to catch for parse errors, and it's called rapidxml::parse_error
, but RapidXML will also throw std::runtime_error
if it fails to find the file.
Here's an example which catches both exception types, plus some catch-all handlers:
#include <iostream>
#include "rapidxml.hpp"
#include "rapidxml_utils.hpp"
int main()
{
try
{
rapidxml::file<> xmlFile("test.xml");
rapidxml::xml_document<> doc;
doc.parse<0>(xmlFile.data());
}
catch (const std::runtime_error& e)
{
std::cerr << "Runtime error was: " << e.what() << std::endl;
}
catch (const rapidxml::parse_error& e)
{
std::cerr << "Parse error was: " << e.what() << std::endl;
}
catch (const std::exception& e)
{
std::cerr << "Error was: " << e.what() << std::endl;
}
catch (...)
{
std::cerr << "An unknown error occurred." << std::endl;
}
}
Upvotes: 4