Could you please elaborate on why it's horrible? Why is user_error preferable to using Exceptions? I admit I don't understand your reasoning.

I could agree with the argument around making a DatabaseException instead of a generic one, but what happens if you need to do something in a try-catch block with a fallback? Should the entire install process spit out uncatchable errors when checking login credentials?

There is no attempt to hide actual errors here, simply to provide a means of handling them when errors may occur during normal execution of code.

I appreciate your thorough feedback by the way. :)