Throw an exception IFF the class cannot be put into a consistent state with regard to its semantic use. Otherwise do not. NEVER allow an object to exist in an inconsistent state. This includes not providing complete constructors (like having an empty constructor + initialize() before your object is actually completely built)...JUST SAY NO!
In a pinch, everyone does it. I did it the other day for a very narrowly used object within a tight scope. Some day down the road, I or someone else will probably pay the price for that slip in practice.
I should note that by "constructor" I mean the thing the client calls to build the object. That could just as easily be something other than an actual construct that goes by the name "Constructor". For example, something like this in C++ wouldn't violate the principle 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>();
}
Since the only way to create a funky_object
is by calling build_funky
the principle of never allowing an invalid object to exist remains intact even though the actual "Constructor" doesn't finish the job.
That's a lot of extra work though for questionable gain (maybe even loss). I'd still prefer the exception route.