RapidXML节点异常处理
RapidXML node exception handling
我正在使用RapidXML来解析包含我想在c++程序中使用的一些变量的xml文件。我能够读取有效的节点,但我想添加一些错误处理,如果一个节点名称拼写错误,例如。
这是我的文件的一个工作示例。
. cpp
try
{
rapidxml::file<> xmlFile("file.xml");
rapidxml::xml_document<> doc;
doc.parse<parse_declaration_node | parse_no_data_nodes>(xmlFile.data());
xml_node<>* prop_node = doc.first_node("PropertyList");
}
catch (const runtime_error& e)
{
// Do something
}
catch (const rapidxml::parse_error& e)
{
// Do something
}
catch (const exception& e)
{
// Do something
}
catch(...)
{
// Do something
}
. xml
<?xml version="1.0" encoding="utf-8"?>
<PropertyList>
...
</PropertyList>
如果我将。cpp文件中的first_node()
调用更改为不存在的节点,如下所示:
xml_node<>* prop_node = doc.first_node("Property");
程序在运行时崩溃,抱怨内存访问错误,而不是抛出异常。
这是RapidXML应该工作的方式还是我做错了什么?
谢谢!
我并不完全熟悉RapidXML,但是我从它的参考页面中找到了以下关于first_node的信息。http://rapidxml.sourceforge.net/manual.html namespacerapidxml_1what_is_rapidxml
函数xml_node: first_node
简介
xml_node* first_node(const Ch *name=0, std::size_t name_size=0)Bool case_sensitive=true) const;描述
获取第一个子节点,可选地匹配节点名称。参数
name要查找的子节点的名称,或者返回0,不管是否返回第一个子节点它的名字;如果name_size,这个字符串不必以零结尾是非零name_size名称的大小,以字符为单位,或0有大小从字符串自动计算,区分大小写比较区分大小写;不区分大小写的比较工作
返回指向找到的子节点,如果没有找到则为0。
因此,您可以调用first_node而不必指定其名称。(虽然这可能不是你问题的直接答案。)
或者检查doc.first_node("Property")的返回值是否为0。并且只有当返回值不为0时才将值赋给prop_node。
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- RapidXML节点异常处理