Перехват исключительных ситуаций в архиве ускоренной сериализации - PullRequest
5 голосов
/ 09 мая 2011

У меня следующая ситуация.

Это фрагмент кода, отредактированный для демонстрации проблемы.

ifstream ifs("empty_file");
if(!ifs.is_open()) {
    ui.display("Error: Unable to open file \"empty_file\"\n");
    return;
}

archive::text_iarchive ia(ifs);
try {
    ia >> some_class;
} catch (...) {
    ui.display("This should catch ever single exception\n");
}

empty_file действительно является абсолютно пустым файлом.Это должно вызвать ошибку;и это делает.Проблема в том, что я не могу отловить исключение, выдаваемое при повышении и злоупотреблении пользователем в связи с предоставлением мне пустого / поврежденного файла для загрузки.

Вместо этого я получаю следующее:

Loading...
terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  invalid signature
Aborted

Насколько я знаю, catch (...) должен перехватывать каждое существующее исключение.Я делаю что-то не так, или boost :: serialization просто перехватывает свое собственное исключение и прерывает (), прежде чем я получаю возможность что-то сделать?

Если последнее имеет место, то это только я илиэто действительно плохой дизайн?Вся ваша программа не должна зависать (прерываться) только из-за поврежденного загрузочного файла.И что я могу с этим поделать?

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Может быть, исключение выдается конструктором.Попробуйте создать свой объект text_iarchive в try, например:

try {
    archive::text_iarchive ia(ifs);
    ia >> some_class;
} catch (...) {
    ui.display("This should catch every single exception\n");
}

Предполагая, что это ловит исключение, вы, конечно, захотите перехватить boost::archive::archive_exception вместо ....

0 голосов
/ 08 июня 2011

Попробуйте проверить параметры ссылки.

У меня похожая проблема, catch(...) не удалось выполнить исключение в write_ini() из boost::property_tree.Я исправил это, удалив -static-libgcc или используя вместе -static-libstdc++.

...