在 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 个小时,但找不到任何我想要的东西。 (或者至少我没有注意到)而且我没有足够的经验来解码原始库文档。它们对我来说就像是加密的,所以我寻找样本。

【问题讨论】:

您似乎在寻找the ptree_bad_path exception。如果您read the reference documentation,您应该可以很快找到它。 谢谢。但由于某种原因,我无法实现它。尝试通过以下方式对其进行测试:try boost::property_tree::read_json("./data.json", pt); catch (const boost::property_tree::ptree_bad_path&amp; e1) std::cout &lt;&lt; "I didnt create the file yet"; catch (const std::exception&amp; e2) std::cout &lt;&lt; e2.what() &lt;&lt; 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 中查找密钥

boost库中读取xml的函数 read_xml的第一个参数不支持中文路径?

如何复制 boost::property_map?

如何从 boost::property_tree 获取枚举?

如何转义字符串以在 Boost Regex 中使用