Obtenga los mensajes de error y / o excepciones de error std :: fstream

Estoy usando Fstream. ¿Hay alguna forma de obtener el mensaje / excepción de falla?

Por ejemplo, si no puedo abrir el archivo?

Las transmisiones de forma predeterminada no lanzan excepciones en caso de error, sino que establecen banderas. Puede hacer que emitan excepciones utilizando la función de miembro de la excepción () de la secuencia:

ifstream ifs; ifs.exceptions( std::ios::failbit ); // throw if failbit get set 

Teóricamente, podrías hacer algo como esto:

 try { int x; ifs >> x; } catch( const std::exception & ex ) { std::cerr << "Could not convert to int - reason is " << ex.what(); } 

Desafortunadamente, el Estándar C ++ no especifica que las excepciones lanzadas contengan ningún mensaje de error, por lo que se encuentra aquí en territorio específico de la implementación.

Respuesta corta: no. Incluso la comprobación de errno después de detectar la falla (utilizando, por ejemplo, bad() , fail() ) después de varias operaciones no funciona de manera confiable. La creación de un ifstream / ofstream envuelva un archivo que no se puede abrir no establece necesariamente un bit de falla hasta que intente leerlo, escribirlo o cerrarlo.

Respuesta larga: puede llamar a ios::exceptions(ios_base::iostate) para solicitar que se ios_base::ios_failure excepciones cuando se establece un bit correspondiente (badbit, failbit, eofbit), pero esto (al menos en GNU y Microsoft C ++) bibliotecas) no obtiene más información que la comprobación manual de los bits, y termina siendo en gran medida inútil, en mi humilde opinión.

GetLastError() echarle un vistazo, descubrí que también errno y GetLastError() establecen el último error y comprobarlos es bastante útil. Para obtener el mensaje de cadena use:

 strerror(errno);