在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)
Posted
技术标签:
【中文标题】在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)【英文标题】:In Boost Property tree library, how I can handle file not found error in custom way (C++) 【发布时间】:2017-02-09 08:42:30 【问题描述】:我想使用 boost 库从 C++ 文件中读取 json 数据。使用属性树。我是编程新手,对 C++ 非常陌生,这是我第一次使用 boost 库。多年前,我在 C 中有一些历史。我有一周的使用 SFML 库的 C++ 经验。
下面是我的模板代码加载文件,读取数据,如果失败给出错误。我想改变我的错误处理方式有点不同。 1. 如果我无法打开提到的文件,因为它不存在,我想创建一个相应命名的空白文件。 2. 但是如果发生其他错误但文件存在,我不想意外删除文件并创建新文件(擦除数据)。
我猜会是这样的
catch (const std::exception& e)
if (e.type == std::exception::filenotfound()) //whatever function i need
boost::property_tree::write_json("./data.json", pt);
else
std::cout << e.what() << std::endl;
因此,我只想在文件真正不存在的情况下创建该文件,但如果我要查找的数据以某种方式损坏、丢失或发生一些无法想象的其他错误,我不想删除它。这是我的模板(没有实现我想要的)
#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
int main()
boost::property_tree::ptree pt;
try
boost::property_tree::read_json("./data.json", pt);
catch (const std::exception& e)
std::cout << e.what() << std::endl;
std::cout << pt.get<std::string>("test_name","default") << std::endl;
return 0;
我应该如何编写这段代码。我在互联网上搜索了 2 个小时,但找不到任何我想要的东西。 (或者至少我没有注意到)而且我没有足够的经验来解码原始库文档。它们对我来说就像是加密的,所以我寻找样本。
【问题讨论】:
您似乎在寻找theptree_bad_path
exception。如果您read the reference documentation,您应该可以很快找到它。
谢谢。但由于某种原因,我无法实现它。尝试通过以下方式对其进行测试:try boost::property_tree::read_json("./data.json", pt); catch (const boost::property_tree::ptree_bad_path& e1) std::cout << "I didnt create the file yet"; catch (const std::exception& e2) std::cout << e2.what() << std::endl;
它仍然给了我原来的错误。我应该如何实现它?
那么是的“原始错误”是什么?
"./data.json 无法打开文件" 是原始错误。我正在尝试首先测试我的实现,让它编写除此之外的其他内容,以便我知道我会覆盖它。
那么打印错误信息?由 Boost 还是由您?是否抛出异常?此外,似乎我对异常有误,它被抛出为实际属性树的错误路径,对此感到抱歉。
【参考方案1】:
https://***.com/users/440558/some-programmer-dude 已经回答了我的问题。这是确切的编码:
try
// Trying to load the file
catch (const boost::property_tree::json_parser_error& e1)
//Here what i do if i cant find the file
如果文件不存在,它会做一些事情。但是如果文件存在,但如果它的格式错误或没有适当的数据,它不会做任何事情。
【讨论】:
以上是关于在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Boost::wave 库中扩展 token_ids 以接受更多关键字
boost库中读取xml的函数 read_xml的第一个参数不支持中文路径?