重试

rescue 子句中,你可以使用 retry 再次运行 begin 子句,可能是在更改导致错误的情况之后。

def divide(x, y)
  begin
    puts "About to divide..."
    return x/y
  rescue ZeroDivisionError
    puts "Don't divide by zero!"
    y = 1
    retry
  rescue TypeError
    puts "Division only works on numbers!"
    return nil
  rescue => e
    puts "Don't do that (%s)" % [e.class]
    return nil
  end
end

如果我们传递我们知道将导致 TypeError 的参数,则执行 begin 子句(通过打印出 About to divide 来标记)并且错误被捕获,并返回 nil

> divide(10, 'a')
About to divide...
Division only works on numbers!
 => nil

但是如果我们传递将导致 ZeroDivisionError 的参数,则执行 begin 子句,捕获错误,将除数从 0 更改为 1,然后 retry 使 begin 块再次运行(从顶部开始),现在使用不同的 y。第二次没有错误,函数返回一个值。

> divide(10, 0)
About to divide...     # First time, 10 ÷ 0
Don't divide by zero!
About to divide...     # Second time 10 ÷ 1
=> 10