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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

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