什么是最佳做法?要使用try
还是使用rescue
?
user.try(:email)
VS
user.email rescue nil
post.try(:comments).try(:first).try(:author)
VS
post.comments.first.author rescue nil
使用其中任何一个有什么不同吗?
答案 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