捕获提升序列化存档异常

Catching boost serialisation archive exceptions

本文关键字:异常 序列化 升序      更新时间:2023-10-16

我有以下情况。

这是一个代码片段,经过编辑以演示问题。

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::序列化只是在我有机会做任何事情之前捕获自己的异常并中止()?

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

也许异常是由构造函数引发的。尝试在try中构造text_iarchive对象,如下所示:

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

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

尝试检查链接选项。

我有一个类似的问题,catch(...) write_ini() boost::property_tree的异常失败了。我通过删除-static-libgcc来修复它,或将其与-static-libstdc++一起使用。