Получить сообщения об ошибках std:: fstream и/или исключения
Я использую fstream. Есть ли способ получить сообщение об ошибке/исключение?
Например, если я не могу открыть файл?
Ответ 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 С++) не дает вам никаких больше информации, чем ручная проверка битов, и заканчивается тем, что в основном бессмысленна, ИМХО.