我有以下情况。
这是一段代码段,经过编辑以证明问题。
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)。我能做些什么呢?
答案 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++
一起使用来修复它。