Получение значимых сообщений об ошибках от fstream в C ++ - PullRequest
14 голосов
/ 14 апреля 2010

Каков наилучший способ получения значимых сообщений об ошибках доступа к файлам переносимым способом из std :: fstreams? Примитивность badbits и failbits становится немного раздражающей. Я уже писал свои собственные иерархии исключений для win32 и POSIX, и это было гораздо более гибким, чем то, как это делает STL.

Я получаю «basic :: ios_clear» как сообщение об ошибке от метода what пониженного улова (std::exception) fstream, для которого включены исключения. Для меня это не имеет большого значения, хотя я знаю, в чем проблема, и я хотел бы, чтобы моя программа была более информативной, чтобы через несколько месяцев после начала развертывания моя жизнь стала легче.

Есть ли в Boost что-нибудь для извлечения значимых сообщений из реализации fstream кроссплатформенной и кросс-STL-реализации?

Ответы [ 2 ]

7 голосов
/ 14 апреля 2010

Никто не мешает вам также проверить errno / strerror (например, в вашем обработчике исключений) для более конкретной причины сбоя.

ОБНОВЛЕНИЕ - относительно переносимости

Кстати, реализация IIRC Visual Studio fstream вызывает _open / _read / _write / и т. Д. Методы CRT, которые устанавливают errno. Microsoft не дает никаких гарантий относительно того, что GetLastError все еще содержит правильное значение после возврата методов CRT. То же самое для реализаций cygwin, mingw и т. Д., Которые устанавливают errno без претензий или гарантий о GetLastError.

Итак, я поддерживаю мое утверждение, что все, что вам нужно, может и поэтому хочет сделать, это проверить errno.

Теперь, учитывая все вышесказанное, если вы все еще хотите усложнить свою жизнь и переобучиться, используя Boost::System вместо простого вызова strerror, тогда я думаю, что мое определение и ваше определение элегантности и простоты не совпадают. :)

0 голосов
/ 15 апреля 2010

Какую информацию вы хотите? badbit указывает на ошибку ввода / вывода. eofbit обозначает eof. failbit указывает на ошибку разбора.

Чтобы исключить одно решение, я не думаю, что вы можете переопределить функции ввода нативного типа из-за ADL. Вы можете реализовать operator>>(istream, input_safe_int), где input_safe_int состоит из int&. Поместите блок try внутрь и т. Д.

...