Перехват исключений архива сериализации boost

#c #exception #serialization #boost #archive

#c #исключение #сериализация #повышение #Архив

Вопрос:

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

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

 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 exceptionn");
}
  

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

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Кхм. Я просто притворюсь, что я не настолько глуп… беспечно свистит . Кроме того, извините; но я не могу пометить ваш ответ как принятый еще в течение трех минут. РЕДАКТИРОВАТЬ: И да, это первый оператор catch, который у меня есть, но, как я сказал в вопросе, код был обработан так, чтобы не быть раздутым, но все еще демонстрировать мою проблему (идиотизм).

2. @Tim: И я просто притворюсь, что никогда не совершал подобных ошибок. ; v)

Ответ №2:

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

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