这是一个错误处理反模式吗?

时间:2017-06-21 17:46:38

标签: ruby-on-rails ruby

一位同事最近告诉我这是一种反模式(recordActiveRecord):

  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

他的论点是我正在使用流量控制的异常(我同意这很糟糕),但我相信这是一种典型的错误处理模式。

思想?

1 个答案:

答案 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