Resumiendo algunas respuestas
Por defecto, las corrientes no generen excepciones. Pueden si están habilitados.
stringstream out;
out.exceptions(std::ios::failbit); // throw exception if failbit gets set
Según el std Apache C++ Standard Library User's Guide
La bandera :: ios_base :: badbit indica problemas con el búfer de la secuencia subyacente. Estos problemas podrían ser:
Carencia de memoria. No hay memoria disponible para crear el búfer, o el búfer tiene el tamaño 0 por otros motivos (como que se proporciona desde fuera de la secuencia), o la secuencia no puede asignar memoria para sus propios datos internos, como con std :: ios_base :: iword() y std :: ios_base :: pword().
El almacenamiento intermedio de transmisión subyacente arroja una excepción. El almacenamiento intermedio de transmisión puede perder su integridad, como falta de memoria o error de conversión de código, o un error de lectura irrecuperable del dispositivo externo. El almacenamiento intermedio de flujo puede indicar esta pérdida de integridad lanzando una excepción, que es captada por el flujo y da como resultado el establecimiento del badbit en el estado del flujo.
Generalmente, debe tener en cuenta que el badbit indica una situación de error que es probable que sea irrecuperable, mientras que el error indica una situación que podría permitirle volver a intentar la operación fallida.
así que parece que la forma más segura de hacer esto sería
string do_something(int in)
{
stringstream out; // This could throw a bad_alloc
out << std::fixed << in; // This could set bad or fail bits
if(out.good())
{
return out.str();
}
else
{
return "";
}
}
Ésta es una exageración, porque aunque de acuerdo a Handling bad_alloc si la creación de la corriente de falla, hay problemas más grandes de las que preocuparse, y el programa probablemente va a salir. Entonces, suponiendo que pasa la creación de la transmisión, es posible pero muy poco probable que se establezca el badbit. (El flujo se asigna con la memoria < sizeof (int)).
Tampoco es probable que se establezca el failbit (no estoy seguro de un caso de uso para leer la pila que no sea una pila corrupta). Por lo tanto, el siguiente código es suficiente, ya que la recuperación de un error de transmisión en este momento es poco probable.
string do_something(int in)
{
stringstream out;
out << std::fixed << in;
return out.str();
}
Ese código es una locura.Está detectando un error provocado por la transmisión y luego usa ** la misma transmisión ** para intentar comunicar ese error. Peor aún, está ensuciando su código de bajo nivel con un manejo de excepciones completamente sin sentido que no hace nada para * recuperar * del error, dejando el flujo en un estado roto. Debería detectar estos errores en un nivel en el que puede * hacer * algo acerca de ellos, incluso si solo está alertando al usuario y cancelando el programa. Este es un abuso completo del manejo de excepciones. – meagar
Puede lanzar excepciones, pero solo si las ha habilitado llamando 'out.exceptions (selected_exceptions)'. Una secuencia construida por defecto no arroja excepciones (excepto 'bad_alloc', que difícilmente puede manejar aquí). –
Puedes manejar totalmente 'bad_alloc'. Solo libera un montón de memoria. –