c++ exception stl portability defensive-programming

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. :)