如果XML文件无效,RapidXml会抛出异常。是否有可能从这种失败中恢复过来?
例如,是否可以事先检查XML是否有效,或者恢复并继续?
似乎当这种失败发生时,只有断言和退出流程,没有恢复的机会。
答案 0 :(得分:4)
默认情况下,RapidXML会引发解析错误的异常;它没有断言(也许断言你只是意味着流程中止)。
如果在包含RapidXML标头之前#define RAPIDXML_NO_EXCEPTIONS
,可以使用your own error handler called rapidxml::parse_error_handler
配置RapidXML,如果这样的错误处理程序返回,RapidXML将调用assert(0)
,但我怀疑你没有启用,你只需要抓住正确的例外。
只有一个异常来捕获解析错误,并且它被称为rapidxml::parse_error
,但如果找不到文件,RapidXML也会抛出std::runtime_error
。
这是一个捕获两种异常类型的示例,以及一些全能处理程序:
#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;
}
}