【发布时间】:2011-09-10 22:03:03
【问题描述】:
我试图理解 Ruby 中的异常,但我有点困惑。我正在使用的教程说,如果发生与救援语句标识的任何异常都不匹配的异常,您可以使用“else”来捕获它:
begin
# -
rescue OneTypeOfException
# -
rescue AnotherTypeOfException
# -
else
# Other exceptions
ensure
# Always will be executed
end
但是,我在教程后面也看到“救援”被使用,没有指定异常:
begin
file = open("/unexistant_file")
if file
puts "File opened successfully"
end
rescue
file = STDIN
end
print file, "==", STDIN, "\n"
如果你能做到这一点,那么我是否需要使用 else ?或者我可以像这样在最后使用通用救援吗?
begin
# -
rescue OneTypeOfException
# -
rescue AnotherTypeOfException
# -
rescue
# Other exceptions
ensure
# Always will be executed
end
【问题讨论】:
-
教程是什么,不知道不推荐?
-
@AndrewGrimm 经过一番谷歌搜索,我认为提问者所遵循的教程是tutorialspoint.com/ruby/ruby_exceptions.htm。额外的 WTF:该教程的作者似乎抄袭了rubylearning.com/satishtalim/ruby_exceptions.html 的第一个示例(它已经不正确),但通过搞砸了 cmets 的缩进使情况变得更糟。是的,我认为引导人们远离它是明智的 - 无能和不诚实的完美结合!
-
以防万一有人遇到同样的问题。在“The Ruby Way. 第三版”中,作者声明
begin块内的else子句用于挽救前面rescue子句中未指定类型的错误(与本教程中的教程基本相同)问题说)。这是不正确的。这让我困惑了一段时间 -
要明确:在
begin/end块中,else块仅在没有引发异常时运行。它不是“任何其他”异常的包罗万象。对else的需求非常罕见……通常,您只需将正在进行的、非异常的代码放在主begin块中,然后再进行任何救援。有关else的一些合法深奥用法,请参阅稍后的答案。