Ruby救援和最佳实践语法

Car*_*lyL 3 ruby syntax ruby-on-rails rescue

我有一些看起来类似于此的代码:

foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue ''
Run Code Online (Sandbox Code Playgroud)

一旦我开始使用Rubocop,就会在那里大吼大叫救援语法.所以我认为至少有两种方法可以编写这些代码:

foo = 
begin
  foo = SomeActiveRecordModel.where(bar: 10).first.foo
rescue NoMethodError
  ''
end
Run Code Online (Sandbox Code Playgroud)

和:

foo = SomeActiveRecordModel.where(bar: 10).first
foo.present? ? foo.foo : ''
Run Code Online (Sandbox Code Playgroud)

哪种方式更受欢迎,或者是否有其他首选方式?

Ser*_*sev 9

异常处理是为了处理异常情况.显然,有时可能没有记录.用捕获NoMethodError来处理它绝对是错误的方法.首先,它不仅会捕获"没有方法foo on nil:NilClass",而是所有其他"无方法"错误,这可能发生(错误在某处等).

因此,"记录未找到"是一种非特殊的情感,你必须按照某种条件处理它.

foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar
Run Code Online (Sandbox Code Playgroud)


Mor*_*ori 5

通常的经验法则是,例外情况应该保留用于特殊情况,即那些在正常控制流程中没有预料到的情况.首先,它们通常比替代品慢.

这是我喜欢的场景:

foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''
Run Code Online (Sandbox Code Playgroud)