#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
вместе.