在Ruby中,没有结束的情况下可以进行双重救援吗?

问题描述:

我有一些通过rspec测试的代码。看起来我不需要end在Ruby中有双重rescue,或者甚至在begin的情况下。实质上,如果遇到Geocoder错误,我将返回5,如果包含CustomError,则返回6,否则返回7在Ruby中,没有结束的情况下可以进行双重救援吗?

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

如果你看过关于使用'rescue'一些教程,它很可能帮助。这是我见过的所有Ruby书籍的一部分。 –

的方法就是自己begin/end块,这样你就可以做rescue当你需要它,也ensure当你需要它。

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

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

+0

7只缩进2个空格(它与救援内联),而6和5缩进4个空格,所以如果没有任何错误被击中,将不会返回7? – Nona

+4

这不是python,这是ruby。除了提高可读性以外,缩进没有任何意义。 – SteveTurczyn

+0

'7'永远不会被退回。 –

缩进在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