cout可以抛出异常吗?

时间:2018-06-22 01:20:07

标签: c++ cout ostream

  • cout是“ ostream”类型的实例
  • ostream::operator<<

    If the operation sets an internal state flag that was registered with
    member exceptions, the function throws an exception of member type failure.
    

这向我表明cout可以引发异常。这是真的?哪种情况可能会导致这种情况?

1 个答案:

答案 0 :(得分:4)

是的,但是几乎没有人调用cout.exceptions(iostate)来启用它。

编辑以阐明:

std::ios_base是一个抽象类,为所有流提供基本的实用程序功能。 std::ios_base<CharT, Traits>是其抽象子类,添加了更多实用程序功能。

std::ios_base::iostate是一种位掩码类型,由以下位组成,可以被or编辑:

badbit (used for weird underlying errors)
eofbit (used after you hit EOF)
failbit (the normal error for badly-formatted input)

另外,iostate::goodbit等效于iostate()(基本上为0)。

通常,当您执行I / O时,您需要检查流的布尔值,以查看是否在每次输入操作(例如: if (cin >> val) { cout << val; } ...对于输出,可以简单地发出一堆并仅在最后检查成功(对于cout,则完全不检查)是可以的。

但是,有些人更喜欢异常,因此每个流都可以配置为将某些返回值转换为异常:

std::ios_base::iostate exceptions() const;
void exceptions(std::ios_base::iostate except);

在C ++中很少这样做,因为我们不会盲目地崇拜像某些其他语言的依附者这样的异常。特别是,“ I / O出了点问题”是通常情况,因此扭曲控制流没有任何意义。

一个例子:

$ cat cout.cpp
#include <iostream>

int main()
{
    std::cout.exceptions(std::cout.badbit);

    std::cout << "error if written to a pipe" << std::endl;
}
$ sh -c 'trap "" PIPE; ./cout | true'
vvv 2018-06-21 23:33:13-0700
terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]'
  what():  basic_ios::clear: iostream error
Aborted

(请注意,在Unix系统上,您必须忽略SIGPIPE才能使程序甚至有机会来处理此类错误,因为对于许多程序而言,简单地退出是解决问题的正确方法这样做-通常这就是允许head工作的原因)