Lanzar una excepción IFF la clase no puede ponerse en un estado consistente con respecto a su uso semántico. De lo contrario no lo hagas. NUNCA permita que exista un objeto en un estado inconsistente. Esto incluye no proporcionar constructores completos (como tener un constructor vacío + initialize () antes de que su objeto esté realmente completamente construido) ... ¡SOLO DIGA NO!
En caso de apuro, todos lo hacen. Lo hice el otro día para un objeto de uso muy limitado dentro de un alcance estrecho. Algún día en el futuro, yo u otra persona probablemente pagaremos el precio de ese desliz en la práctica.
Debo señalar que por "constructor" me refiero a lo que el cliente llama para construir el objeto. Eso podría ser fácilmente algo más que una construcción real que se conoce con el nombre de "Constructor". Por ejemplo, algo así en C ++ no violaría el principio IMNSHO:
struct funky_object
{
...
private:
funky_object();
bool initialize(std::string);
friend boost::optional<funky_object> build_funky(std::string);
};
boost::optional<funky_object> build_funky(std::string str)
{
funky_object fo;
if (fo.initialize(str)) return fo;
return boost::optional<funky_object>();
}
Dado que la única forma de crear un funky_object
es llamando build_funky
al principio de nunca permitir que exista un objeto no válido, permanece intacto aunque el "Constructor" real no termine el trabajo.
Sin embargo, eso es mucho trabajo adicional para obtener ganancias cuestionables (tal vez incluso pérdidas). Todavía prefiero la ruta de excepción.