Получение значимых сообщений об ошибках от fstream's в C++

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

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

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

14
задан Hassan Syed 14 April 2010 в 23:11
поделиться

2 ответа

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

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

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

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

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

7
ответ дан 1 December 2019 в 16:24
поделиться

Какая информация вам нужна? badbit указывает на ошибку ввода-вывода. eofbit указывает eof. бит отказа указывает на ошибку синтаксического анализа.

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

0
ответ дан 1 December 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: