我注意到rails中的某些方法使用!
运算符来引发异常(如果无效)。例如,User.create!
为什么以及何时我想使用这样的东西?
感谢。
答案 0 :(得分:6)
我可能出于各种原因需要例外
begin ... rescue ... end
使其更清晰。当错误状态数量很少且在调用后直接完全处理时,有充分的理由不使用异常,而是使用状态标志。但每种技术都有它的位置和时间。
顺便说一下,save
方法在内部调用save!
,处理潜在的异常,如果有则返回false。有关实施,请参阅the code。
答案 1 :(得分:4)
ActiveRecord will roll back a transaction if an exception is thrown while a transaction is active
因此,抛出异常的方法可以确保数据库在发生异常情况时不提交事务。当您可以自己“处理”问题时 - 或者,如果它实际上不是问题 - 那么您可以使用不带!
的变体,检查错误条件的返回值,并自己处理它们。
针对特定内容,例如User.create
:
User.create
方法确定用户提供的用户名是否尚未被选中,并提示用户选择其他名称(如果已经在使用中)。User.create!
方法,以便在用户尝试绕过您的友好名称检查时,您的完整性检查可能无法创建并回滚事务。