开发者

Best Practice: Try vs Rescue

What is a best practice? To use try or use rescue?

user.try(:email)

VS

user.email rescue nil

post.try(:com开发者_C百科ments).try(:first).try(:author)

VS

post.comments.first.author rescue nil

Is there any difference in using any of these?


Try and rescue serve different purposes. The purpose of try is to save you from having to do:

if user && user.email

Or any situation where the parent object can possibly be nil, which would cause a NoMethodError on NilClass. The purpose of rescue is to handle exceptions that get thrown by your method invocation. If you expect an exception from calling user.email, then you can rescue nil it to prevent the exception from bubbling up.

In general, I'd say avoid using rescue nil unless you know explicitly what exceptions you are rescuing because you could be rescuing a different exception, and you would never know it because rescue nil would prevent you from seeing it. At the very least maybe you could log it:

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


Both seem fishy and can mask other bugs. Are you sure you really want to get nil there? Maybe it would be better to check whether there are any comments first, and cover the empty case explicitly?


Nothing is Something is an excellent talk by Sandi Metz that helps understand why @AdamByrtek is spot on, and why we should all be marking the failed cases in a smarter, more object-oriented way that x ? y : nil

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜