最佳实践:尝试与拯救

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

 user.try(:email) 

VS

 user.email rescue nil 

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

VS

 post.comments.first.author rescue nil 

使用任何这些有什么不同?

尝试和拯救服务不同的目的。 try的目的是为了避免你必须做的事情:

 if user && user.email 

或者父对象可能为零的任何情况,这将导致NilClass上的NoMethodError。 rescue的目的是处理您的方法调用引发的exception。 如果您期望调用user.email的exception,那么您可以rescue nil它,以防止exception冒泡。

一般来说,我会说避免使用rescue nil除非你明确知道你是救援的例外,因为你可以拯救一个不同的例外,你永远不会知道,因为rescue nil将阻止你看到它。 至less也许你可以logging它:

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

这两个都似乎腥,可以掩盖其他的错误。 你确定你真的想在那里吗? 也许最好先检查一下是否有任何意见,并明确覆盖空案件?

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