2011-05-19 79 views
61

什么是最佳实践?要使用try或使用rescue最佳实践:尝试与拯救

user.try(:email) 

VS

user.email rescue nil 

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

VS

post.comments.first.author rescue nil 

是否有使用任何这些有什么区别?

回答

95

尝试和营救服务不同的目的。的try目的是为了节省您不必做:

if user && user.email 

或任何情况下的父对象都不可能是零,这将导致对NilClass一个NoMethodError。 rescue的目的是处理由方法调用引发的异常。如果你期望有一个例外来自user.email,那么你可以用rescue nil它来防止异常冒泡。

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

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

我希望这有一个链接到尝试源。 – 2012-09-27 16:27:12

+4

这里是[文档和源代码](http://api.rubyonrails.org/classes/Object.html#method-i-try)到'ActiveSuppot#try'。 – 2012-11-20 06:28:54

8

两者都显得鱼腥味,可以掩盖其他错误。你确定你真的想在那里得到零吗?也许最好先检查是否有任何评论,并明确地覆盖空案件?

4

Nothing is Something是三弟梅斯一个很好的谈话,有助于理解为什么@AdamByrtek是当场上,为什么我们都应该标志着失败的案例在一个更聪明,更面向对象的方式x ? y : nil

+2

非常感谢分享,但这应该是一个评论。 – Stefan 2015-08-13 15:12:02

+0

好点,谢谢。下次会这样做。这是我的第一反应,所以有点兴奋:) – 2015-08-13 15:15:07