为什么“其他”?

我想了解Ruby中的异常,但我有点困惑。 我正在使用的教程说,如果发生的异常与救援语句标识的任何异常不匹配,您可以使用“else”来捕获它:

begin  
# -  
rescue OneTypeOfException  
# -  
rescue AnotherTypeOfException  
# -  
else  
# Other exceptions
ensure
# Always will be executed
end

但是,我也在后面的教程中看到“rescue”正在使用,没有指定例外情况:

begin
    file = open("/unexistant_file")
    if file
         puts "File opened successfully"
    end
rescue
    file = STDIN
end
print file, "==", STDIN, "n"

如果你能做到这一点,那么我是否需要使用别的? 或者我可以像这样在最后使用通用救援?

begin  
# -  
rescue OneTypeOfException  
# -  
rescue AnotherTypeOfException  
# -  
rescue
# Other exceptions
ensure
# Always will be executed
end

else代表块在完成时没有抛出异常。 在ensure运行块是否成功完成。 例:

begin
  puts "Hello, world!"
rescue
  puts "rescue"
else
  puts "else"
ensure
  puts "ensure"
end

这将打印Hello, world! ,那么else ,然后ensure


这是begin表达式中else的具体用例。 假设您正在编写自动化测试,并且您想编写一个方法来返回块引发的错误。 但是如果块没有引发错误,你也希望测试失败。 你可以这样做:

def get_error_from(&block)
  begin
    block.call
  rescue => err
    err  # we want to return this
  else
    raise "No error was raised"
  end
end

请注意,您无法在begin区块内移动raise ,因为它会得到rescue d。 当然,也有不使用其他的方法else ,如检查是否errnilend ,但是这不是简洁。

就我个人而言,我很少使用else方式,因为我认为这很少需要,但它确实在那些罕见的情况下派上用场。


当您可能期望发生某种异常时,将使用开始救援结束块中的else块。 如果你运行了所有预期的异常,但仍然没有产生任何异常,那么在你的其他块中,你可以做任何需要的,现在你知道你的原始代码没有错误。

链接地址: http://www.djcxy.com/p/4397.html

上一篇: Why "else"?

下一篇: Begin, Rescue and Ensure in Ruby?