检查不同的错误

如果要根据错误类型执行不同的操作,请使用多个 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