Получение значимых сообщений об ошибках из 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
внутри и т.д.