你们可以帮我解决boost::iostreams::mapped_file_sink
引发的未知异常吗?
我的配置
这是我的代码
try
{
boost::iostreams::mapped_file_params params_;
boost::iostreams::mapped_file_sink sink_;
params_.length = 0;
params_.new_file_size = 1024;
params_.path = "./test.bin";
sink_.open(params_);
sink_.close();
}
catch (std::ios::failure& ex)
{
std::cout << "\t" << "what: " << ex.what() << "\n";
}
catch (std::system_error& ex)
{
std::cout << "\t" << "code: " << ex.code() << " what: " << ex.what() << "\n";
}
catch (std::runtime_error& ex)
{
std::cout << "\t" << ex.what() << "\n";
}
catch (boost::archive::archive_exception& ex)
{
std::cout << "\t" << ex.what() << "\n";
}
catch (boost::exception& ex)
{
std::cout << "blah\n";
}
catch (std::exception& ex)
{
std::cout << "\t" << ex.what() << " --- " << typeid(ex).name() << "\n";
}
它始终适用于Windows。
在Ubuntu中,它会创建给定大小的空文件,但会在open()
上抛出异常。后续执行代码 if 不会导致异常。
最糟糕的是我无法看到异常的原因。我只能抓住std::exception
what()
返回毫无意义的“std :: exception”。
在绝望的尝试中找出错误,我输出显示
的typeid(ex).name()
N5boost16exception_detail10clone_implINS0_19error_info_injectorISt9exception
根据Google的含义:boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::exception> >
任何想法有什么不对?
答案 0 :(得分:1)
您可以在调试器中运行代码,并在函数中设置一个实际抛出异常的断点,例如__cxa_throw
。系统的名称可能与您的系统不同:使用nm -po program | less
并搜索包含throw
的函数。在一个(或多个)中设置一个断点,看起来很可能就像它们是由系统创建的。如果抛出的异常很少,您还可以将断点设置为std::exception::exception()
。
答案 1 :(得分:1)
经过50分钟的猜测,我发现问题出现在length
字段中。文档没有说明,但其默认值必须为-1,如源代码
BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));
我直觉地假设如果我将new_file_size
设置为大于零,则会忽略length
。