Pregunta 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?


32
2018-05-08 12:48


origen


Respuestas:


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.


30
2018-05-08 13:03



Respuesta corta: no. Incluso revisando errno después de detectar la falla (usando, p. bad(), fail()) después de varias operaciones no funciona de manera confiable. Creando un ifstream/ofstream envolver un archivo que no se puede abrir no establece necesariamente un bit de falla hasta que intente leerlo, escribirlo o cerrarlo.

Larga respuesta: puedes llamar ios::exceptions(ios_base::iostate) para solicitar eso ios_base::ios_failure Se lanzarán excepciones cuando se establezca un bit correspondiente (badbit, failbit, eofbit), pero esto (al menos en las bibliotecas GNU y Microsoft C ++) no obtiene más información que la comprobación manual de los bits, y termina siendo en gran parte inútil. EN MI HUMILDE OPINIÓN.


9
2018-05-08 13:05



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

strerror(errno);

2
2018-05-16 18:19