为什么“其他”?
我想了解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
,如检查是否err
是nil
后end
,但是这不是简洁。
就我个人而言,我很少使用else
方式,因为我认为这很少需要,但它确实在那些罕见的情况下派上用场。
当您可能期望发生某种异常时,将使用开始救援结束块中的else
块。 如果你运行了所有预期的异常,但仍然没有产生任何异常,那么在你的其他块中,你可以做任何需要的,现在你知道你的原始代码没有错误。
上一篇: Why "else"?