如何处理 RapidXml 错误?

How do I handle RapidXml errors?

RapidXml 在 XML 文件无效的情况下抛出异常。有可能从这样的故障中恢复吗?

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

好像出现这种故障的时候,只有进程的断言和退出,没有恢复的机会。

默认情况下,RapidXML 在解析错误时引发异常;它没有断言(也许断言你只是意味着进程中止)。

如果您在包含 RapidXML headers 之前 #define RAPIDXML_NO_EXCEPTIONS,则可以使用 your own error handler called rapidxml::parse_error_handler 配置 RapidXML,并且如果这样的错误处理程序 returns,RapidXML 将调用 assert(0),但我怀疑你没有启用它,你只需要捕获正确的异常。

只有一个异常需要捕获解析错误,如果找不到文件,则称为 rapidxml::parse_error, but RapidXML will also throw std::runtime_error

这是一个捕获两种异常类型以及一些 catch-all 处理程序的示例:

#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;
    }
}