В библиотеке дерева свойств Boost, как я могу обработать ошибку, не найденную файлом, нестандартным способом (С++)

Я хочу прочитать данные json из файла на С++, используя библиотеки boost. Использование дерева свойств. Я новичок в программировании, очень новичок в С++ и впервые использую библиотеку boost. У меня была некоторая история в C много лет назад. И у меня есть недельный опыт работы с C++ с использованием библиотеки SFML.

Ниже мой код шаблона загружает файл, считывает данные и в случае сбоя выдает ошибку. Я хочу немного изменить обработку ошибок. 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 часов, но я не мог найти ничего, что я хотел. (Или, по крайней мере, я не заметил) И у меня недостаточно опыта, чтобы декодировать оригинальную библиотечную документацию. Они кажутся мне зашифрованными, поэтому вместо этого я ищу образцы.


person Kaan Kara    schedule 09.02.2017    source источник
comment
Похоже, вы ищете ptree_bad_path исключение. Вы должны были найти его довольно быстро, если бы прочитать справочную документацию.   -  person Some programmer dude    schedule 09.02.2017
comment
Спасибо. Но по какой-то причине мне не удалось это реализовать. Пробовал проверить следующим образом: 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; } Все равно выдавал исходную ошибку. Как мне это реализовать?   -  person Kaan Kara    schedule 09.02.2017
comment
И в чем является исходная ошибка?   -  person Some programmer dude    schedule 09.02.2017
comment
./data.json не может открыть файл, это исходная ошибка. Сначала я пытаюсь проверить свою реализацию, заставив ее написать что-то другое, поэтому я буду знать, что переопределил ее.   -  person Kaan Kara    schedule 09.02.2017
comment
Так что сообщение об ошибке печатается? Бустом или вами? Выбрасывается ли исключение? Также кажется, что я ошибся с исключением, оно выбрано из-за неправильного пути для фактического дерева свойств, извините за это.   -  person Some programmer dude    schedule 09.02.2017
comment
Это сообщение об ошибке выводится стандартной библиотекой. (Вторая часть блога) Я не выбрасывал исключение внутри кода, а удалил файл для его имитации. В любом случае все равно спасибо за старания.   -  person Kaan Kara    schedule 09.02.2017
comment
Чтение исходного кода, неспособность открыть файл вызывает ошибка json_parser_error с этой информацией: путь и строка не могут открыть файл. Так вот что вам нужно проверить.   -  person Some programmer dude    schedule 09.02.2017
comment
Большое тебе спасибо. Это решило мою проблему.   -  person Kaan Kara    schedule 09.02.2017


Ответы (1)


https://stackoverflow.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
}

Если файл не существует, он что-то делает. Но если файл существует, но в неправильном формате или не имеет соответствующих данных, он ничего не делает.

person Kaan Kara    schedule 09.02.2017