最佳实践: 尝试与拯救

什么是最佳实践? 使用 try还是使用 rescue

user.try(:email)

VS

user.email rescue nil

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

VS

post.comments.first.author rescue nil

使用这些有什么区别吗?

57846 次浏览

两者看起来都很可疑,可以掩盖其他虫子。你确定你真的想一无所获吗?也许最好先检查是否有注释,然后明确地覆盖空格?

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