最佳实践:尝试与救援

Lui*_*sVM 71 ruby ruby-on-rails

什么是最佳做法?使用try或使用rescue

user.try(:email)
Run Code Online (Sandbox Code Playgroud)

VS

user.email rescue nil
Run Code Online (Sandbox Code Playgroud)
post.try(:comments).try(:first).try(:author)
Run Code Online (Sandbox Code Playgroud)

VS

post.comments.first.author rescue nil
Run Code Online (Sandbox Code Playgroud)

使用其中任何一个有什么不同吗?

Jac*_*Chu 110

尝试和救援用于不同的目的.目的try是为了避免您不得不这样做:

if user && user.email
Run Code Online (Sandbox Code Playgroud)

或者父对象可能为nil的任何情况,这将导致NilClass上的NoMethodError.目的rescue是处理由方法调用抛出的异常.如果您希望调用异常user.email,则可以rescue nil防止异常冒泡.

一般来说,我会说避免使用,rescue nil除非你明确知道你正在拯救什么例外,因为你可能正在拯救一个不同的例外,你永远不会知道它,因为rescue nil会阻止你看到它.至少也许你可以记录它:

begin
  ...some code...
rescue => ex
  logger.error ex.message
end
Run Code Online (Sandbox Code Playgroud)

  • 这是[doc和source](http://api.rubyonrails.org/classes/Object.html#method-i-try)到`ActiveSuppot#try`. (4认同)

Ada*_*tek 7

两者看起来都很腥,可以掩盖其他虫子.你确定你真的想在那里搞砸吗?也许最好首先检查是否有任何评论,并明确地覆盖空案例?