【问题标题】:In Ruby, is it ok to have a double rescue without an end?在 Ruby 中,可以无休止地进行双重救援吗?
【发布时间】:2016-01-21 23:08:53
【问题描述】:

我有一些通过 rspec 测试的代码。看来我不需要 end 和 Ruby 中的双 rescue,甚至不需要 begin。本质上,当遇到 Geocoder 错误时我返回 5,如果遇到 CustomError 则返回 6,否则返回 7

def get_stuff
  puts "some code work"
  rescue ::Geocoder::Error => e
    puts "hello"
    return 5
  rescue CustomError => e
    puts "world"
    return 6
  7
end

【问题讨论】:

  • 如果您阅读一些关于使用rescue 的教程可能会有所帮助。这是我看过的所有 Ruby 书籍的一部分。
  • 函数定义有一个隐式的开始块。所以rescue 位于def 块上,就像在其他情况下它位于显式begin 块上一样。正如其他人所提到的,缩进在 Ruby 中毫无意义。

标签: ruby rescue


【解决方案1】:

缩进在 Ruby 中并不重要。从技术上讲,7 永远不会被返回,因为您将它放在了 return 6 行之后的救援块内。

如果您想在没有引发错误的情况下返回7,请将其放在rescue 块之前的最后一行:

def get_stuff
  puts "some code work"
  7 #success!
  rescue ::Geocoder::Error => e
    puts "hello"
    return 5
  rescue CustomError => e
    puts "world"
    return 6
end

【讨论】:

    【解决方案2】:

    一个方法是它自己的begin/end块,所以你可以在需要的时候使用rescue,在需要的时候也可以使用ensure

    正如您所做的那样,如果rescueensure 块应该返回一个值,您确实需要执行明确的return 语句。

    ...虽然我很惊讶您收到 7 的返回...这是您的第二个救援块的一部分,不应该返回。

    【讨论】:

    • 7 仅缩进 2 个空格(它与救援内联),而 6 和 5 缩进 4 个空格,所以如果没有遇到任何错误,不会返回 7 吗?
    • 这不是 python,这是 ruby​​。除了提高可读性之外,缩进没有任何意义。
    • 7 永远不会被退回。
    • 在这种情况下,return 是不正确的。
    • @SteveTurczyn,我用这个示例代码中的一些值替换了实际代码 - 在这种情况下,7 被替换为实际的方法/函数调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多