最佳实践:尝试与拯救
什么是最佳做法? 要使用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