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
。
这里有一个begin
expression式的具体用例。 假设你正在编写自动化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