【问题标题】:Catching boost serialisation archive exceptions捕获 boost 序列化归档异常
【发布时间】:2011-08-21 20:26:58
【问题描述】:

我有以下情况。

这是一个代码 sn-p,经过编辑以演示问题。

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::serialisation 只是在我有机会做任何事情之前捕获了它自己的异常并 abort()ing?

如果是后者,那只是我的问题还是那真的很糟糕的设计?您的整个程序不应仅因损坏的加载文件而崩溃(中止())。我该怎么办?

【问题讨论】:

    标签: c++ exception serialization boost archive


    【解决方案1】:

    也许异常是由构造函数抛出的。尝试在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 而不是...

    【讨论】:

    • 咳咳。我就假装自己没那么傻……漫不经心地吹口哨。另外,对不起;但我无法再将您的答案标记为已接受三分钟。编辑:是的,这是我拥有的第一个 catch 语句,但是,正如我在问题中所说,代码被设计成不会臃肿但仍然证明我的问题(白痴)。
    • @Tim:我会假装我从未犯过类似的错误。 ;v)
    【解决方案2】:

    尝试检查链接选项。

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

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2018-01-08
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多