ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
¿Cómo obtener un mensaje de error como cadena?
c++
error-handling
stream
std
Alex F
fuente
fuente
cerr << "Error code: " << strerror(errno); // Get some info as to why
parece relevante para la pregunta.strerror(errno)
funciona. Publique esto como respuesta, lo aceptaré.Respuestas:
Cada llamada al sistema que falla actualiza el
errno
valor.Por lo tanto, puede tener más información sobre lo que sucede cuando
ifstream
falla una apertura usando algo como:Sin embargo, dado que cada llamada al sistema actualiza elerrno
valor global , es posible que tenga problemas en una aplicación multiproceso si otra llamada al sistema desencadena un error entre la ejecuciónf.open
y el uso deerrno
.En sistema con estándar POSIX:
Editar (gracias a Arne Mertz y otras personas en los comentarios):
e.what()
Al principio parecía ser una forma más C ++ - idiomáticamente correcta de implementar esto, sin embargo, la cadena devuelta por esta función depende de la implementación y (al menos en libstdc ++ de G ++) esta cadena no tiene información útil sobre la razón detrás del error ...fuente
e.what()
no parece dar mucha información, vea actualizaciones a mi respuesta.errno
utiliza almacenamiento local de subprocesos en sistemas operativos modernos. Sin embargo, no hay garantía de que lasfstream
funciones no funcionenerrno
después de que se produzca un error. Es posible que las funciones subyacentes no se establezcanerrno
en absoluto (llamadas directas al sistema en Linux o Win32). Esto no funciona en muchas implementaciones del mundo real.e.what()
siempre imprime el mismo mensaje "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'
Podría intentar dejar que la transmisión arroje una excepción en caso de falla:
e.what()
, sin embargo, no parece ser muy útil:strerror(errno)
da "No existe tal archivo o directorio".Si
e.what()
no funciona para usted (no sé qué le dirá sobre el error, ya que no está estandarizado), intente usarstd::make_error_condition
(solo C ++ 11):fuente
strerror(errno)
publicado en los comentarios funciona y es muy simple de usar. Creo quee.what
funcionará, ya queerrno
funciona.e.what()
eso será lo questrerror
regrese, de una manera segura para subprocesos. Ambos probablemente dependerán de la plataforma.exception.what()
. Puede ser una buena oportunidad para sumergirse en el código fuente de libstdc ++ :-)basic_ios::clear
, nada más. Esto no es realmente útil. Por eso noSiguiendo la respuesta de @Arne Mertz, a partir de C ++ 11
std::ios_base::failure
hereda desystem_error
(consulte http://www.cplusplus.com/reference/ios/ios_base/failure/ ), que contiene tanto el código de error como el mensaje questrerror(errno)
devolvería.Esto se imprime
No such file or directory.
sifileName
no existe.fuente
iostream stream error
.iostream error
. ¿En qué compilador probaste esto? ¿Algún compilador proporciona realmente una razón legible por el usuario para el error?unspecified iostream_category error
.También puede lanzar un
std::system_error
como se muestra en el código de prueba a continuación. Este método parece producir una salida más legible quef.exception(...)
.Salida de ejemplo (Ubuntu w / clang):
fuente