Потоки ввода-вывода C++ Boost, обработка ошибок

Можно ли сделать так, чтобы пользовательский поток работал как стандартный в отношении ошибок? То есть по умолчанию используются биты good/fail/bad/eof, а не исключения?

В документах boost упоминается только выдача std::failure для ошибок потока и разрешение распространения других ошибок (например, badalloc из-за попытки выделить буфер), однако код boost, похоже, не улавливает их, вместо этого полагаясь на пользовательский код для обработки их, но весь мой существующий код опирается на методы good(), bad() и т. д., а также на метод clear() в тех случаях, когда необходимо повторить попытку после ошибки.


person Fire Lancer    schedule 20.07.2009    source источник
comment
Какие документы Boost вы просматриваете?   -  person John Zwinck    schedule 15.11.2009
comment
boost.org/doc/libs/1_39_0/libs/ iostreams/doc/index.html   -  person Fire Lancer    schedule 16.11.2009
comment
В boost.org/doc/libs /1_39_0/libs/iostreams/doc/guide/ Третьей возможностью было бы последовать примеру std::basic_streambuf и разрешить функциям-членам фильтров и устройств сигнализировать об ошибках либо путем создания исключений, либо путем возврата указанной ошибки. индикаторы. Это было отклонено, потому что это усложнило бы спецификации различных концепций фильтров и устройств и затруднило бы понимание и поддержку внутреннего устройства stream_buffer.   -  person akramer    schedule 28.12.2011
comment
@akramer: Вероятно, вам следует сделать свой комментарий ответом.   -  person André Caron    schedule 04.04.2012


Ответы (1)


Из http://www.trip.net/~bobwb/cppnotes/lec08.htm< /а>

Состояние ошибки можно установить с помощью:

недействительным очистить (iostate = 0);

Значение по умолчанию, равное нулю, приводит к установке ios_base::goodbit.

чистый();

поэтому эквивалентно

очистить (0);

что эквивалентно

очистить (ios_base:: goodbit);

Обратите внимание, что ios_base::goodbit — это ненулевое значение. clear() может использоваться для установки одного из других битов как часть кода программиста для оператора>>() для конкретного объекта. Например:

если (bad_char) is.clear(ios_base::badbit); // устанавливаем бэдбит istream

person gymbrall    schedule 03.04.2012
comment
Вопрос, который я прочитал, когда я ответил, касался использования пользовательского потока, а затем ссылался на потоки повышения. Мне было неясно, интересуются ли его только потоки повышения, как они есть, если он сам их подклассифицировал, или его собственные пользовательские потоки. - person gymbrall; 04.04.2012