ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Как получить сообщение об ошибке в виде строки?
c++
error-handling
stream
std
Алекс Ф
источник
источник
cerr << "Error code: " << strerror(errno); // Get some info as to why
кажется относящимся к вопросу.strerror(errno)
работает. Отправьте это как ответ, я приму это.Ответы:
Каждый неудачный системный вызов обновляет
errno
значение.Таким образом, вы можете получить больше информации о том, что происходит при
ifstream
сбое открытия, используя что-то вроде:Однако, поскольку каждый системный вызов обновляет глобальноеerrno
значение, у вас могут возникнуть проблемы в многопоточном приложении, если другой системный вызов вызывает ошибку между выполнениемf.open
и использованиемerrno
.В системе со стандартом POSIX:
Изменить (спасибо Арне Мерцу и другим людям в комментариях):
e.what()
Сначала казалось, что это более правильный с ++ - идиоматически правильный способ реализации этого, однако строка, возвращаемая этой функцией, зависит от реализации и (по крайней мере, в libstdc ++ G ++) эта строка не содержит полезной информации о причине ошибки ...источник
e.what()
похоже, не дает много информации, см. обновления моего ответа.errno
использует локальное хранилище потоков в современных операционных системах. Однако нет никакой гарантии, чтоfstream
функции не будут работатьerrno
после ошибки errno. Базовые функции могут вообще не устанавливатьсяerrno
(прямые системные вызовы в Linux или Win32). Это не работает во многих реализациях в реальном мире.e.what()
всегда выводит одно и то же сообщение "iostream stream error
"warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\string.h(168) : see declaration of 'strerror'
Вы можете попробовать разрешить потоку генерировать исключение в случае сбоя:
e.what()
, однако, не очень помогает:strerror(errno)
дает «Нет такого файла или каталога».Если у
e.what()
вас не работает (я не знаю, что он скажет вам об ошибке, поскольку это не стандартизовано), попробуйте использоватьstd::make_error_condition
(только C ++ 11):источник
strerror(errno)
опубликованный в комментариях работает и очень прост в использовании. Я думаю, чтоe.what
сработает, т.к.errno
работает.e.what()
это будет тоstrerror
, что вернется в потокобезопасном режиме. Оба, вероятно, будут зависеть от платформы.exception.what()
. Может быть, это хорошая возможность погрузиться в исходный код libstdc ++ :-)basic_ios::clear
, больше ничего. Это не очень полезно. Вот почему я не публиковал;)Следуя ответу @Arne Mertz, начиная с C ++ 11
std::ios_base::failure
наследуется отsystem_error
(см. Http://www.cplusplus.com/reference/ios/ios_base/failure/ ), который содержит как код ошибки, так и сообщение, котороеstrerror(errno)
будет возвращено.Это печатает,
No such file or directory.
еслиfileName
не существует.источник
iostream stream error
.iostream error
. На каком компиляторе вы это тестировали? Действительно ли какой-либо компилятор предоставляет читаемую пользователем причину сбоя?unspecified iostream_category error
.Вы также можете бросить,
std::system_error
как показано в тестовом коде ниже. Этот метод, кажется, дает более читаемый результат, чемf.exception(...)
.Пример вывода (Ubuntu w / clang):
источник