Obtener mensajes de error significativos de fstream en C++
exception stl (2)
¿Qué información quieres? badbit
indica un error de E / S. eofbit
indica eof. failbit
indica un error de análisis.
Para eliminar una solución, de todos modos, no creo que pueda anular las funciones de entrada de tipo nativo debido a ADL. Podría implementar operator>>(istream, input_safe_int)
donde input_safe_int
se construye desde int&
. Ponga un bloque try
adentro, etc.
¿Cuál es la mejor manera de obtener mensajes de error significativos de acceso a archivos de manera estándar desde std :: fstreams? La primitividad de los badbits
y los failbits
está failbits
un poco molesta. Escribí mis propias jerarquías de excepción contra win32 y POSIX antes, y eso fue mucho más flexible que la forma en que lo hace STL.
Obtengo "basic :: ios_clear" como un mensaje de error del método what
de una captura fstream
( std::exception
) de un fstream
que tiene habilitadas las excepciones. Esto no significa mucho para mí, aunque sí sé cuál es el problema. Me gustaría que mi programa fuera un poco más informativo, de modo que cuando empiece a implementarlo unos meses más tarde, mi vida será más fácil.
¿Hay algo en Boost para extraer mensajes significativos de la plataforma cruzada de implementación de fstream
y la implementación cruzada de STL?
Nadie te impide que también compruebe errno
/ strerror
(por ejemplo, en tu manejador de excepciones) por un motivo más específico de falla.
ACTUALIZACIÓN - con respecto a la portabilidad
Por cierto, la implementación fstream
IIRC Visual Studio llama a _open
/ _read
/ _write
/ etc. Los métodos CRT, que establecen errno
. Microsoft no garantiza que GetLastError
aún contenga el valor correcto después de que los métodos CRT regresen. Idem para las implementaciones de cygwin, mingw etc., que configuran errno
sin reclamos ni garantías sobre GetLastError
.
Así que estoy de acuerdo con mi afirmación de que todo lo que necesita, puede y, por lo tanto, desea hacer es verificar errno
.
Ahora, dado todo lo anterior, si aún desea complicar su vida y sobremanera mediante el uso de Boost::System
lugar de simplemente llamar a strerror
entonces supongo que mi definición y su definición de elegancia y simplicidad no son las mismas. :)