(1)给定基本(可能是CV限定的)类型x
的任意变量X
,并且
(2)格式为
的输出语句outputStream << x;
其中outputStream
是任何标准<iostream>
输出流(cout
,cerr
,clog
,wcout
,{{1} },wcerr
):
C ++ 11标准对可能从语句(2)抛出的异常类型有什么限制?假设我想写为精确的wclog
匹配可能,并且不限于抓住catch
。
例如,我是否还要测试std::exception
或来自std::bad_alloc
的任何其他例外,或者所有例外情况仅限于<stdexcept>
?
ios_base::failure
PS:请保持这个工具链和平台不可知,严格的C ++ 11问题。评论&#34;为什么&amp;#$%你想写这样的代码?&#34;不具有建设性。我只是想知道在最恶劣的标准兼容情况下会出现什么样的异常。谢谢! :)
答案 0 :(得分:1)
来自here
异常安全基本保证:如果抛出异常,则 对象处于有效状态。它会抛出成员类型的异常 如果生成的错误状态标志不是goodbit和成员,则失败 异常被设置为抛出该状态。任何抛出的异常 内部操作由功能,设置捕获和处理 badbit。如果在最后一次调用异常时设置了badbit,则该函数 重新捕获被捕获的异常。
因此,如果您设置failure
以允许此操作,则只会抛出exceptions
个例外。如果您允许,它也只会抛出基础异常。
如果您想要精细控制,请阅读exception masks。
答案 1 :(得分:1)
根据this description std::ios_base::failure
是标准输入/输出库的所有元素抛出的异常的基类,包括从std::ios_base
派生的类作为std::istream
和std::ostream
(以及std::cin
,std::cout
等)。但是,请注意,这不包括其他标准库中的类,例如来自std::basic_ostringstream
的{{1}}也可能会从其分配器中抛出异常。
但是,默认情况下 不会引发任何异常。发生错误时,使用相应流对象上的<sstream>
方法在流的内部错误状态标志上设置std::ios_base::eofbit
,std::ios_base::failbit
和/或std::ios_base::badbit
位。根据{{3}},如果设置了错误状态标志,则当且仅当流的当前异常掩码具有相应的标志位时,才抛出相应的异常。默认情况下,当前异常掩码没有设置位,因此不会抛出异常。可以使用std::ios::setstate()
方法更改此异常掩码,并使流在出错时抛出异常。