Подтвердить что ты не робот

Получить сообщения об ошибках std:: fstream и/или исключения

Я использую fstream. Есть ли способ получить сообщение об ошибке/исключение?

Например, если я не могу открыть файл?

4b9b3361

Ответ 1

Из проверки этого я обнаружил, что также errno, а также GetLastError() установить последнюю ошибку, и их проверка весьма полезна. Для получения строкового сообщения используйте:

strerror(errno);

Ответ 2

Потоки по умолчанию не генерируют исключения при ошибке, они устанавливают флаги. Вы можете заставить их генерировать исключения с помощью функции member exception():

ifstream ifs;
ifs.exceptions( std::ios::failbit );   // throw if failbit get set

Теоретически, вы могли бы сделать что-то вроде этого:

try {
  int x;
  ifs >> x;
}
catch( const std::exception & ex ) {
   std::cerr << "Could not convert to int - reason is " 
                  << ex.what();
}

К сожалению, стандарт С++ не указывает, что в заброшенных исключениях содержится какое-либо сообщение об ошибке, поэтому вы находитесь на конкретной территории реализации.

Ответ 3

Короткий ответ: нет. Даже проверяя errno после обнаружения сбоя (используя, например, bad(), fail()) после того, как различные операции не работают надежно. Создание обтекания ifstream/ofstream файла, который не может быть открыт, не обязательно устанавливает бит сбоя, пока вы не попытаетесь его прочитать, записать или закрыть.

Длинный ответ: вы можете вызвать ios::exceptions(ios_base::iostate), чтобы запросить, чтобы были исключены исключения ios_base::ios_failure, когда установлен соответствующий бит (badbit, failbit, eofbit), но это (по крайней мере, в GNU и Microsoft С++) не дает вам никаких больше информации, чем ручная проверка битов, и заканчивается тем, что в основном бессмысленна, ИМХО.