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

What kind of exceptions can formatted output operators standard iostream objects throw?

本文关键字:什么样 异常 对象 输出 运算符 标准 iostream 格式化      更新时间:2023-10-16

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

(2) 形式的格式化输出语句

outputStream << x;

其中outputStream是标准<iostream>输出流(coutcerrclogwcoutwcerrwclog)中的任何一个:

C++11标准对语句(2)中可能抛出的异常类型意味着什么限制假设我想写尽可能精确的catch匹配,而不局限于捕获std::exception

例如,我是否也应该测试std::bad_alloc<stdexcept>的任何其他异常,或者所有异常都仅限于ios_base::failure

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

附言:请让我们保持这是一个与工具链和平台无关的、严格的C++11问题。像"为什么你想写这样的代码?"这样的评论是没有建设性的。我只是想知道,在最糟糕的符合标准的情况下,会出现什么样的例外情况。谢谢!:)

从这里开始

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

因此,如果您已将exceptions设置为允许,它将只抛出failure异常。如果你允许的话,它也只会抛出潜在的异常

如果您想要细粒度的控制,请阅读有关异常掩码的内容。

根据此描述std::ios_base::failure是标准输入/输出库的所有元素引发异常的基类,包括从std::ios_base派生的类,如std::istreamstd::ostream(因此还有std::cinstd::cout等)。但是,请注意,这不包括其他标准库中的类,例如<sstream>中的std::basic_ostringstream也可能从其分配器引发异常。

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