檢查不同的錯誤

如果要根據錯誤型別執行不同的操作,請使用多個 rescue 子句,每個子句具有不同的錯誤型別作為引數。

def divide(x, y)
  begin
    return x/y
  rescue ZeroDivisionError
    puts "Don't divide by zero!"
    return nil
  rescue TypeError
    puts "Division only works on numbers!"
    return nil
  end
end

> divide(10, 0)
Don't divide by zero!

> divide(10, 'a')
Division only works on numbers!

如果要儲存錯誤以便在 rescue 塊中使用:

rescue ZeroDivisionError => e

使用不帶引數的 rescue 子句來捕獲未在另一個 rescue 子句中指定的型別的錯誤。

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

> divide(nil, 2)
Don't do that (NoMethodError)

在這種情況下,試圖將 nil 除以 2 不是 ZeroDivisionErrorTypeError,所以它由預設的 rescue 子句處理,它列印出一條訊息讓我們知道它是一個 NoMethodError