一位同事最近告诉我这是一种反模式(record
是ActiveRecord
):
begin
record.save!
do_something_else
rescue => e
puts "Unable to save"
end
......而我应该这样做:
if record.save
do_something_else
else
puts "Unable to save"
end
他的论点是我正在使用流量控制的异常(我同意这很糟糕),但我相信这是一种典型的错误处理模式。
思想?
答案 0 :(得分:4)
这是一个反模式,因为有更好的方法来检查记录的有效性而不是运行save!
(如果它无效则会引发错误)。
这可能是你的同事所得到的:
if record.save
do_something_else
else
puts record.errors.full_messages
end
你知道,使用错误作为控制流没有任何好处,因为有更少的迂回方式。
您还可以独立于保存尝试运行验证。调用errors.full_messages
时会填充record.valid?
数组(字符串)。 record.save
在内部调用record.valid?
。
if record.valid?
record.save # or save!; by this point you can assume the record is valid
else
puts record.errors.full_messages
end