最佳实践:尝试与救援


73

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

user.try(:email)

VS

user.email rescue nil

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

VS

post.comments.first.author rescue nil

使用这些方法有什么区别吗?

Answers:


113

尝试和救援有不同的目的。的目的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

我希望它有一个到try源的链接。
新亚历山大(亚历山大)

4
这里的文档和源ActiveSuppot#try
朱Jack(Jack Chu)

7

两者看起来都很脏,并且可以掩盖其他错误。您确定您真的要在那里零钱吗?也许最好先检查是否有任何评论,然后明确覆盖空白案例?


4

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


2
精彩演讲,感谢您的分享,但这应该是一条评论。
Stefan

好点,谢谢。下次会这样做。这是我的第一反应,所以有点激动:)
Jonathan_W 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.