格式化的输出运算符标准iostream对象可以抛出什么样的异常
What kind of exceptions can formatted output operators standard iostream objects throw?
(1)给定一个基本(可能是CV限定的)类型X
的任意变量x
,并且
(2) 形式的格式化输出语句
outputStream << x;
其中outputStream
是标准<iostream>
输出流(cout
、cerr
、clog
、wcout
、wcerr
、wclog
)中的任何一个:
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::istream
和std::ostream
(因此还有std::cin
、std::cout
等)。但是,请注意,这不包括其他标准库中的类,例如<sstream>
中的std::basic_ostringstream
也可能从其分配器引发异常。
但是,默认情况下不会引发异常。出错时,使用相应流对象上的std::ios::setstate()
方法在流的内部错误状态标志上设置std::ios_base::eofbit
、std::ios_base::failbit
和/或std::ios_base::badbit
位。根据该描述,如果设置了错误状态标志,则当且仅当流的当前异常掩码设置了相应的标志位时,抛出相应的异常。默认情况下,当前异常掩码没有设置任何位,因此不会引发异常。可以使用std::ios::exceptions()
方法来更改此异常掩码,并使流在出错时抛出异常。
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 返回的指向C++对象的链接是什么样的
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- boost::ifind_first 会引发什么样的异常?
- 格式化的输出运算符标准iostream对象可以抛出什么样的异常