如何处理RapidXml错误?

时间:2015-04-06 15:52:58

标签: c++ xml rapidxml

如果XML文件无效,RapidXml会抛出异常。是否有可能从这种失败中恢复过来?

例如,是否可以事先检查XML是否有效,或者恢复并继续?

似乎当这种失败发生时,只有断言和退出流程,没有恢复的机会。

1 个答案:

答案 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;
    }
}