检查不同的错误
如果要根据错误类型执行不同的操作,请使用多个 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 不是 ZeroDivisionError
或 TypeError
,所以它由默认的 rescue
子句处理,它打印出一条消息让我们知道它是一个 NoMethodError
。