最佳实践:尝试与救援

时间:2011-05-19 18:39:54

标签: ruby-on-rails ruby

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

user.try(:email)

VS

user.email rescue nil

post.try(:comments).try(:first).try(:author)

VS

post.comments.first.author rescue nil

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

3 个答案:

答案 0 :(得分:109)

尝试和救援服务于不同的目的。 try的目的是让您不必这样做:

if user && user.email

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

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

begin
  ...some code...
rescue => ex
  logger.error ex.message
end

答案 1 :(得分:7)

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

答案 2 :(得分:4)

Nothing is Something是Sandi Metz的精彩演讲,有助于理解@AdamByrtek为什么会出现,以及为什么我们都应该以更智能,更面向对象的方式标记失败的案例x ? y : nil