如何处理 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;
}
}
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;
}
}