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 whyparece relevante para la pregunta.strerror(errno)funciona. Publique esto como respuesta, lo aceptaré.Respuestas:
Cada llamada al sistema que falla actualiza el
errnovalor.Por lo tanto, puede tener más información sobre lo que sucede cuando
ifstreamfalla una apertura usando algo como:Sin embargo, dado que cada llamada al sistema actualiza elerrnovalor global , es posible que tenga problemas en una aplicación multiproceso si otra llamada al sistema desencadena un error entre la ejecuciónf.openy 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.errnoutiliza almacenamiento local de subprocesos en sistemas operativos modernos. Sin embargo, no hay garantía de que lasfstreamfunciones no funcionenerrnodespués de que se produzca un error. Es posible que las funciones subyacentes no se establezcanerrnoen 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.whatfuncionará, ya queerrnofunciona.e.what()eso será lo questrerrorregrese, 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::failurehereda 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.sifileNameno 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_errorcomo 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