Ruby 救援和最佳实践语法

Ruby rescue and best practice syntax

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

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 : ''

首选这些方式中的哪一种,或者是否有首选的替代方式?

从现在开始,两者都不是首选方式。首选方式是:

foo = SomeActiveRecordModel.where(bar: 10).first&.foo || ""

通常的经验法则是例外情况应保留用于特殊情况,即您在正常控制流中不希望出现的情况。一方面,它们通常比替代品慢。

以下是我更喜欢的场景:

foo = SomeActiveRecordModel.find_by_bar(10).try(:foo) || ''

异常处理是为了处理异常情况。显然,有时可能没有记录。用捕获 NoMethodError 来处理它绝对是错误的做法。一方面,它不仅会捕获 "no method foo on nil:NilClass",还会捕获所有其他 "no method" 错误,这些错误可能会发生(某处打字错误等)。

因此,"record not found" 作为一个非特殊情况,您必须这样处理它,并带有某种条件。

foo = SomeActiveRecordModel.where(bar: 10).first
return '' unless foo
foo.bar