В каких случаях стандартные потоки C++ сообщают об ошибках через исключения?
Я никак не могу найти ответ на следующий вопрос, в каких случаях std::fstream сообщает об ошибках через исключения, а в каких - через установку флагов ошибок.
Знаю про существование метода fstream::exceptions(), который позволяет включить генерацию исключений для определенных видов (флагов) ошибок, но после многократного прочтения доступной документации я запутался окончательно.
Например, я не понимаю следующего: если генерация исключений отключена, тогда будет ли поток генерировать исключения при ошибках, которые возникает в уже инвалидированном потоке?
Или, например: если генерация исключений включена, то будет ли поток генерировать исключения сразу же, или же он будет генерировать исключение только в том случае, если соответствующий флаг ошибочного состояния уже был выставлен (то есть, при повторении ошибки)?
Ответы (1 шт):
дело в том, что std::ios_base::exceptions при вызове без аргументов, возвращает состояние исключения в потоке. Если нигде она не была вызвана с аргументом, то есть не было команды генерировать исключение при установке того или иного флага, то она будет возвращать нулевое значение, а это значит, что не генерируется исключение. Генерироваться будет исключение именно ios_base::failure(именно его должны пытаться поймать и обработать) при установке тех флагов, которая вернет std::ios_base::exceptions.
Например:
void foo(ios_base& stream)
{
ios_base::iostate s = stream.exceptions();
if (s & ios_base::failbit)
cout << "будет генерировано исключение ios_base::failure при неверном вводе ";
else if (s == 0) {
cout << "не будет генерировано исключение";
stream.exceptions(ios_base::badbit);
//теперь будет генерировано исключение ios_base::failure, если поток сломан
}
}
Значит ответ на первый вопрос:
- Нет, не будет генерирован исключение, если нет команды генерировать его.
Ответ на второй вопрос:
- Исключение будет генерирован сразу же, как только будет выставлен флаг состояния исключения, то есть при первой же "ошибке".