【问题标题】:Boost exception at runtime在运行时提升异常
【发布时间】:2009-02-16 23:35:40
【问题描述】:

使用此代码:

#include <fstream>

#include <boost/archive/text_oarchive.hpp>

using namespace std;

int main()
{
    std::ofstream ofs("c:\test");
    boost::archive::text_oarchive oa(ofs);
}

在执行 boost 归档行时,我在运行时遇到未处理的异常:

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::archive::archive_exception> >

【问题讨论】:

    标签: c++ boost runtime-error


    【解决方案1】:

    以下行有误:

     std::ofstream ofs("c:\test");
    

    如果您的文件名为jest,编译器(至少)会发出警告;但是'\t'——作为插入选项卡的转义符,你的错误未被发现。简而言之,文件不会被创建。您可以使用以下方法进行测试:

    if (ofs.good()) { ... }
    

    现在,由于未创建文件,因此您没有有效的迭代器可传递给引发异常的boost::archive::text_oarchive

    试试这个:

    std::ofstream ofs("c:\\test");
    //                  --^ (note the extra backslash)
    if (ofs.good()) {
        boost::archive::text_oarchive oa(ofs);
        // ...
    }
    

    希望这会有所帮助!

    PS:我无法阻止自己制作的最后一招——如果你要使用的话

    using namespace std;
    

    然后

    ofstream ofs("c:\\test");
    

    足够好。当然,限定ofstream 不是错误,但它不是最好的编码风格。但是,你知道使用using namespace 不好,不是吗?

    PPS:谢谢你 -- sharptooth 提醒我 \t 给你一个标签!

    【讨论】:

    • \t 是水平制表符,所以编译器不太可能感觉到气味。
    • 您也可以只使用 c:/test - 正斜杠在 Windows 和 Unix 系统上都可以用作路径分隔符,不需要引用。
    • 当然。很少有人在 Windows 上使用它。
    • 谢谢,我在发现异常后很快就弄清楚了(请原谅我问这个问题,这已经是漫长的一天了),但仍然有一些有用的提示,所以谢谢。不过我很好奇,为什么使用命名空间不好?
    • `using namespace std' 将 std 命名空间中的所有符号转储到全局命名空间,造成污染。查找命名空间污染。
    【解决方案2】:

    您需要捕获异常,然后检查其 exception_code 以了解根本原因。

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多