I feel that the conventional use case of validations is returning the
object with the errors attribute(s) set to let you know which parts
failed. A validation is used to confirm that user data entry conforms
to necessary constraints, in normal processing (ie. a controller
calling record.save) the exceptions are not raised and you need to
deal with failure.
If the code is being run in a programmatic way, that is the data entry
is not coming from a user, and you are using record.save! it, in my
read of the Rails conventions, be considered a programmatic error if
it resulted in an exception. Your calling code should be giving valid
values and not relying on exceptions to determine next action. The
exception raised here should probably halt execution, or at the least
send out crazy warnings (including examination of the record.errors
object).
Your use case may vary :)