重试
在 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