捕获提升序列化归档例外

时间:2011-05-09 16:53:01

标签: c++ exception serialization boost archive

我有以下情况。

这是一段代码段,经过编辑以证明问题。

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确实是一个完全空的文件。这应该会导致错误;它确实如此。问题是我无法捕获boost引发的异常并滥用用户给我一个空的/损坏的文件来加载。

相反,我得到以下内容:

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

据我所知,catch(...)应该捕获存在的每个异常。我做错了什么,或者是boost :: serialization只是在我有机会做任何事情之前捕获它自己的异常和abort()ing?

如果是后者,那么它只是我还是那个非常糟糕的设计?您的整个程序不应该只是从损坏的加载文件崩溃(abort()ing)。我能做些什么呢?

2 个答案:

答案 0 :(得分:7)

构造函数可能抛出异常。尝试在try中构建text_iarchive对象,如下所示:

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

假设捕获异常,您当然希望捕获boost::archive::archive_exception而不是...

答案 1 :(得分:0)

尝试检查链接选项。

我遇到了类似的问题,catch(...) write_ini()的{​​{1}}内的例外失败了boost::property_tree。我通过删除-static-libgcc或将其与-static-libstdc++一起使用来修复它。