Rubyexception – 为什么“其他”?

我想了解Ruby中的exception,但我有点困惑。 我正在使用的教程说,如果发生的exception与救援语句所标识的任何exception都不匹配,您可以使用“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是当块完成时没有抛出exception。 无论块是否成功完成,都会执行确认。 例:

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

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

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

 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 。 当然,还有其他的方法可以不用,比如检查err是否在end之后是nil ,但这并不简单。

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

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

我能看到的else块的唯一原因是,如果你想在ensure块之前执行某些东西,那么当begin块中的代码没有引发任何错误的时候。

 begin puts "Hello" rescue puts "Error" else puts "Success" ensure puts "my old friend" puts "I've come to talk with you again." end