【问题标题】:What kind of exceptions can formatted output operators standard iostream objects throw?格式化输出操作符标准 iostream 对象会抛出什么样的异常?
【发布时间】:2014-10-21 11:36:02
【问题描述】:

(1) 给定一个基本(可能是 CV 限定)类型 X 的任意变量 x,并且

(2) 格式输出语句

outputStream << x;

其中outputStream 是任何标准&lt;iostream&gt; 输出流(coutcerrclogwcoutwcerrwclog):

C++11标准对语句(2)可能抛出的异常类型有什么限制?假设我想写出尽可能精确的catch匹配,并且不限制自己捕捉std::exception

例如,我是否也应该测试std::bad_alloc&lt;stdexcept&gt; 的任何其他异常,还是所有异常都限于ios_base::failure

try {
    outputStream << x;
} catch (/* ??? */) { /* ... */ }
} catch (/* ??? */) { /* ... */ }
// ... ???

PS:请保持这个工具链和平台无关,严格的 C++11 问题。诸如“为什么 $% 你要编写这样的代码?”之类的评论没有建设性。我只想知道在最坏的符合标准的情况下会出现什么样的例外情况。谢谢! :)

【问题讨论】:

标签: c++ c++11 iostream c++-standard-library


【解决方案1】:

来自here

异常安全基本保证:如果抛出异常, 对象处于有效状态。它抛出成员类型的异常 如果生成的错误状态标志不是 goodbit 和 member,则失败 异常被设置为该状态抛出。任何抛出的异常 内部操作被函数捕获和处理,设置 坏蛋。如果在最后一次调用异常时设置了 badbit,则函数 重新抛出捕获的异常。

所以它只会抛出failure 异常,如果你设置exceptions 允许这个。它也只会在您允许的情况下引发基础异常。

如果您想要精细控制,请阅读exception masks

【讨论】:

    【解决方案2】:

    根据this descriptionstd::ios_base::failure是标准输入/输出库的所有元素抛出异常的基类,包括从std::ios_base派生的类,例如std::istream和@ 987654326@(因此有std::cinstd::cout 等)。但是,请注意,这不包括来自其他标准库的类,例如来自&lt;sstream&gt;std::basic_ostringstream 也可能从其分配器中抛出异常。

    但是,默认情况下不会引发异常。错误时,std::ios_base::eofbitstd::ios_base::failbit 和/或std::ios_base::badbit 位使用相应流对象上的std::ios::setstate() 方法在流的内部错误状态标志上设置。根据this description,如果设置了错误状态标志,则当且仅当流的当前异常掩码设置了相应的标志位时,才会引发相应的异常。默认情况下,当前异常掩码没有设置位,因此不会引发异常。可以利用std::ios::exceptions() 方法更改此异常掩码,并使流在出错时抛出异常。

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多