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