重試

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