Да, но практически никто никогда не вызывает cout.exceptions(iostate)
, чтобы включить это.
Изменить, чтобы разъяснить:
std::ios_base
— это абстрактный класс, предоставляющий базовые служебные функции для всех потоков. std::ios_base<CharT, Traits>
является его абстрактным подклассом, добавляющим дополнительные служебные функции.
std::ios_base::iostate
— это тип битовой маски, состоящий из следующих битов, может быть or
ed:
badbit (used for weird underlying errors)
eofbit (used after you hit EOF)
failbit (the normal error for badly-formatted input)
Кроме того, iostate::goodbit
эквивалентно iostate()
(в основном 0).
Обычно, когда вы выполняете ввод-вывод, вы проверяете логическое значение потока, чтобы увидеть, не произошла ли ошибка, после каждой операции ввода, например. if (cin >> val) { cout << val; }
... для вывода можно просто сгенерировать кучу и проверить успех только в конце (или для cout вообще не проверять).
Однако некоторые люди предпочитают исключения, поэтому каждый отдельный поток можно настроить так, чтобы некоторые из этих возвращаемых значений превращались в исключения:
std::ios_base::iostate exceptions() const;
void exceptions(std::ios_base::iostate except);
В C++ это делается редко, поскольку мы не поклоняемся бездумно исключениям, как адепты некоторых других языков. В частности, "что-то пошло не так с вводом/выводом" является обычным случаем, поэтому нет смысла искажать поток управления.
Пример:
$ 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
работать)
22.06.2018