我有一些看起来类似于此的代码:
foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue ''
一旦我开始使用Rubocop,就会在那里大吼大叫救援语法.所以我认为至少有两种方法可以编写这些代码:
foo = begin foo = SomeActiveRecordModel.where(bar: 10).first.foo rescue NoMethodError '' end
和:
foo = SomeActiveRecordModel.where(bar: 10).first foo.present? ? foo.foo : ''
哪种方式更受欢迎,或者是否有其他首选方式?
异常处理是为了处理异常情况.显然,有时可能没有记录.用捕获NoMethodError
来处理它绝对是错误的方法.首先,它不仅会捕获"没有方法foo on nil:NilClass",而是所有其他"无方法"错误,这可能发生(错误在某处等).
因此,"记录未找到"是一种非特殊的情感,你必须按照某种条件处理它.
foo = SomeActiveRecordModel.where(bar: 10).first return '' unless foo foo.bar
通常的经验法则是,例外情况应该保留用于特殊情况,即那些在正常控制流程中没有预料到的情况.首先,它们通常比替代品慢.
这是我喜欢的场景:
foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''