2015-04-06 174 views
3

如果XML文件无效,RapidXml将引发异常。是否有可能从这样的失败中恢复过来?如何处理RapidXml错误?

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

看来,当这样的失败发生时,只有过程的断言和退出,并且没有恢复的机会。

回答

4

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

它可以与your own error handler called rapidxml::parse_error_handler配置RapidXML如果#define RAPIDXML_NO_EXCEPTIONS包括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; 
    } 
}