什么样的异常可以格式化输出运算符标准iostream对象抛出?

时间:2014-10-21 11:36:02

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

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

(2)格式为

的输出语句
outputStream << x;

其中outputStream是任何标准<iostream>输出流(coutcerrclogwcout,{{1} },wcerr):

C ++ 11标准对可能从语句(2)抛出的异常类型有什么限制?假设我想写为精确的wclog匹配可能,并且不限于抓住catch

例如,我是否还要测试std::exception或来自std::bad_alloc的任何其他例外,或者所有例外情况仅限于<stdexcept>

ios_base::failure
PS:请保持这个工具链和平台不可知,严格的C ++ 11问题。评论&#34;为什么&amp;#$%你想写这样的代码?&#34;不具有建设性。我只是想知道在最恶劣的标准兼容情况下会出现什么样的异常。谢谢! :)

2 个答案:

答案 0 :(得分:1)

来自here

  

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

因此,如果您设置failure以允许此操作,则只会抛出exceptions个例外。如果您允许,它也只会抛出基础异常。

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

答案 1 :(得分:1)

根据this description std::ios_base::failure 是标准输入/输出库的所有元素抛出的异常的基类,包括从std::ios_base派生的类作为std::istreamstd::ostream(以及std::cinstd::cout等)。但是,请注意,这不包括其他标准库中的类,例如来自std::basic_ostringstream的{​​{1}}也可能会从其分配器中抛出异常。

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