跳到主要内容

Ruby 异常处理

Ruby 使用异常表示运行时错误。你可以用 beginrescueensure 处理异常,也可以用 raise 主动抛出异常。

一个简单异常

Integer("abc")

这会抛出 ArgumentError,因为 "abc" 不能转换成整数。

rescue

begin
number = Integer("abc")
puts number
rescue ArgumentError => e
puts "转换失败: #{e.message}"
end

rescue 捕获指定异常。e 是异常对象。

ensure

ensure 中的代码无论是否发生异常都会执行:

file = File.open("data.txt")

begin
puts file.read
ensure
file.close
end

不过文件读写更推荐 block 形式:

File.open("data.txt") do |file|
puts file.read
end

Ruby 会在 block 结束后关闭文件。

主动 raise

def divide(a, b)
raise ArgumentError, "b must not be zero" if b == 0

a / b
end

当参数不合法,或程序无法继续完成当前职责时,可以使用 raise

自定义异常

class ConfigError < StandardError
end

raise ConfigError, "missing host"

自定义异常通常继承 StandardError

不要吞掉异常

不好的写法:

begin
do_something
rescue
end

这样会让错误消失,排查问题很痛苦。至少应该记录日志或给出明确处理。

小练习

  1. 捕获 Integer("abc") 的异常并输出提示。
  2. 写一个 divide(a, b),当 b == 0 时抛出 ArgumentError
  3. 自定义一个 ConfigError

小结

异常用于处理无法在当前路径正常完成的情况。你要捕获具体异常、避免吞错,并优先使用 block 形式管理文件等资源。