根据save bang your head, active record will drive you mad,我们应该避免在特殊情况下使用save!
和rescue
成语。鉴于此,假设模型需要@post.mark_rejected
。
如果mark_rejected
中的代码由于下列问题之一而失败,是否应该抛出异常? :
如果我们不抛出异常,那么:
mark_rejected
的返回值并执行此操作rescue
子句,因此异常冒泡到(.. wherever ..)并且可能会显示为一些(500 HTTP?)错误示例代码:
def mark_rejected
...
save!
end
或
def mark_rejected
...
save
end
答案 0 :(得分:126)
save!
会引发错误。
save
将返回布尔值,如true或false。
答案 1 :(得分:20)
异常中有更多的开销,因此存在性能问题,特别是当可能会出现这种情况时,可能会经常抛出它,就像save
一样。
检查返回值是否为假而不是抢救异常的代码行数较少,因此如果您已经必须解除异常,我不会看到如何检查返回值是一个问题。 save!
抛出的异常多久会在实践中冒出调用堆栈?根据我的经验,很少,如果有的话。
如果在调用save
而不是save!
时抛出异常,您应该希望它显示500错误页面,因为发生了这样的事情:一个不可恢复的,未知的,意外的内部服务器错误。 / p>
答案 2 :(得分:3)
建议:当它在最后一行时使用save
;否则save!
。
这个想法:如果方法返回了save的结果,你不应该抛出异常并让调用者处理存储问题,但如果保存被隐藏在模型方法逻辑中,你可能想要中止该进程,例外情况失败。