什么是最佳实践?要使用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
或使用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
的目的是处理由方法调用引发的异常。如果你期望有一个例外来自user.email
,那么你可以用rescue nil
它来防止异常冒泡。
在一般情况下,我会说使用避免rescue nil
除非你明确地知道你正在抢救什么异常,因为你可以拯救一个不同的异常,你永远不会知道,因为rescue nil
会阻止你看到它。至少,也许你可以记录它:
begin
...some code...
rescue => ex
logger.error ex.message
end
两者都显得鱼腥味,可以掩盖其他错误。你确定你真的想在那里得到零吗?也许最好先检查是否有任何评论,并明确地覆盖空案件?
Nothing is Something是三弟梅斯一个很好的谈话,有助于理解为什么@AdamByrtek是当场上,为什么我们都应该标志着失败的案例在一个更聪明,更面向对象的方式x ? y : nil
非常感谢分享,但这应该是一个评论。 – Stefan 2015-08-13 15:12:02
好点,谢谢。下次会这样做。这是我的第一反应,所以有点兴奋:) – 2015-08-13 15:15:07
我希望这有一个链接到尝试源。 – 2012-09-27 16:27:12
这里是[文档和源代码](http://api.rubyonrails.org/classes/Object.html#method-i-try)到'ActiveSuppot#try'。 – 2012-11-20 06:28:54