小编use*_*483的帖子

如何为流提供更好的异常消息?

问题

截至目前,对流的异常支持非常糟糕.当Boost.System库被采用到C++ 11中时,给人的印象是可能会有异常改进.所有的变化所做的替换std::exceptionstd::system_error.虽然<system_error>开发人员本身就是一个很好的库,但标准委员会和标准库实现者并未采取任何措施来使用它来改进异常消息.

为了说明它有多糟糕,这里简要总结了下面的内容:

  • 发生错误.

  • setstate用于设置badbitfailbit.

  • clear被称为setstate.

  • 如果启用了异常,clear则会抛出异常ios_base::failure.

是的,这意味着对于所有错误,抛出相同的无用异常消息.这是在basic_ios级别指定的,因此所有派生类都会遇到此问题.违规报价:

[iostate.flags]/4 效果:如果((state | (rdbuf() ? goodbit : badbit)) & exceptions()) == 0,返回.否则,该函数抛出一个failbasic_ios::failure(27.5.3.1.1)的对象,使用实现定义的参数值构造.

以下是"实现定义的参数值"为我们提供的示例:

ios_base::clear: unspecified iostream_category error
Run Code Online (Sandbox Code Playgroud)

有一个简单的解决方案吗?

既不是Boost.Filesystem也不Boost.Iostreams是替代品<iostream>.前者是一个可以轻松处理文件系统的库(很可能出现在C++的下一个版本中),而后者与.sources和Sinks有关.该文档声明它ios_base::failure无论如何都要委托例外.Boost.Filesystem 确实提供<boost/filesystem/fstream.hpp>了使用path而不是const char*参数open().它显示了一个如何从标准库类继承的示例:

  template …
Run Code Online (Sandbox Code Playgroud)

c++ c++-standard-library c++11

39
推荐指数
1
解决办法
713
查看次数

标签 统计

c++ ×1

c++-standard-library ×1

c++11 ×1