【问题标题】:Best Practice: Try vs Rescue最佳实践:尝试与救援
【发布时间】:2015-09-14 22:30:22
【问题描述】:

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

user.try(:email)

VS

user.email rescue nil

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

VS

post.comments.first.author rescue nil

使用这些有什么不同吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

    【讨论】:

    • 我希望这有一个指向试用源的链接。
    • 这里是doc and sourceActiveSuppot#try
    【解决方案2】:

    两者看起来都很可疑,并且可以掩盖其他错误。你确定你真的想在那里得到 nil 吗?也许最好先检查是否有 cmets,然后明确覆盖空的情况?

    【讨论】:

      【解决方案3】:

      Nothing is Something 是 Sandi Metz 的精彩演讲,有助于理解为什么 @AdamByrtek 会出现,以及为什么我们都应该以比 x ? y : nil 更智能、更面向对象的方式标记失败案例

      【讨论】:

      • 精彩的演讲,感谢分享,但这应该是评论。
      • 好点,谢谢。下次会这样做。这是我的第一反应,所以有点兴奋:)
      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多