I disagree about "Try not to create new custom exceptions if they do not have useful information for client code."..
I think the client code must always know the nature of the exception to provide proper information to end user, especialy when i8n is involved..
How the client code should distinct "user name already exist" and "invalid character in user name" if both are plain java.lang.Exception.
If the UI is not in english, the client code cannot display exception's message, it has to have some semantic..