Would be interesting in hearing their opinion on attempting to catch the exception in the service layer.
I think wrapping your DAO call in a transaction should be avoided.
eg this particular DAO call(creatUser) could be used by another service method(another api maybe). if this new service method fails for another unrelated reason all changes made by the new service will be rolled back(assuming it is also transactionally scoped) but createUser call will not.
This will eventually lead to inconsistent data or orphaned data.
Very good discussion by the way