5.3.2. Streams y excepciones

Los iostream han existido como parte de C++ mucho antes que hubieran excepciones, luego comprobar el estado de un stream manualmente era la manera en que se hacia. Para mantener la compatibilidad, este es todavía el status quo, pero los modernos iostream pueden lanzar excepciones en su lugar. La función miembro de stream exceptions() toma un parámetro representando los bits de estado para los que usted quiere lanzar la excepcion. Siempre que el stream encuentra este estado,este lanza una excepcion de tipo std::ios_base::failure, que hereda de std::exception.

Aunque usted puede disparar una excepción para alguno de los cuatro estados de un stream, no es necesariamente una buena idea activar las excepciones para cada uno de ellos. Tal como explica el Capítulo uno, se usan las excepciones para condiciones verdaderamente excepcionales, ¡pero el final de un fichero no solo no es excepcional! ¡Es lo que se espera! Por esta razón, solo debe querer activar las excepciones para errores representados por badbit, que deberia ser como esto:

myStream.exceptions(ios::badbit);

Usted activa las excepciones stream por stream, ya que exceptions() es una función miembro para los streams. La función exceptions() retorna una máscara de bits [14] (de tipo iostate, que es un tipo dependiente del compilador convertible a int) indicando que estados de stream causarán excepciones. Si estos estados ya han sido activados, la excepción será lanzada inmediatamente. Por supuesto, si usa excepciones en conexiones a streams, debería estar preparado paracapturarlas, lo que quiere decir que necesita envolver todos los stream bon bloques try que tengan un manejador ios::failure. Muchos programadores encuentran tedioso y simplemente comprueban manualmente donde esperan encontrar errores (ya que, por ejemplo, no esperan encontrar bad() al retornar true la mayoria de veces). Esto es otra razón que tienen los streams para que el lanzamiento de excepciones sea opcional y no por defecto. en cualquier caso, usted peude elegir como quiere manejar los errores de stream. Por las mismas razones que recomendamos el uso de excepciones para el manejo de rrores en otros contextos, lo hacemos aqui.



[14] un tipo integral usado para alojar bits aislados.