В каких случаях стандартные потоки C++ сообщают об ошибках через исключения?

Я никак не могу найти ответ на следующий вопрос, в каких случаях std::fstream сообщает об ошибках через исключения, а в каких - через установку флагов ошибок.

Знаю про существование метода fstream::exceptions(), который позволяет включить генерацию исключений для определенных видов (флагов) ошибок, но после многократного прочтения доступной документации я запутался окончательно.

Например, я не понимаю следующего: если генерация исключений отключена, тогда будет ли поток генерировать исключения при ошибках, которые возникает в уже инвалидированном потоке?

Или, например: если генерация исключений включена, то будет ли поток генерировать исключения сразу же, или же он будет генерировать исключение только в том случае, если соответствующий флаг ошибочного состояния уже был выставлен (то есть, при повторении ошибки)?


Ответы (1 шт):

Автор решения: AR Hovsepyan

дело в том, что 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, если поток сломан
    }
}

Значит ответ на первый вопрос:

  • Нет, не будет генерирован исключение, если нет команды генерировать его.

Ответ на второй вопрос:

  • Исключение будет генерирован сразу же, как только будет выставлен флаг состояния исключения, то есть при первой же "ошибке".
→ Ссылка