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:
friend boost::optional<funky_object> build_funky(std::string);
boost::optional<funky_object> build_funky(std::string str)
if (fo.initialize(str)) return fo;
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.