在 Ruby 中,异常处理是通过 begin
、rescue
和 end
关键字来实现的。当代码块中发生异常时,会跳转到最近的 rescue
代码块中执行,如果没有找到匹配的 rescue
代码块,异常会一直往外层抛出,直到找到匹配的 rescue
代码块或者到达顶层代码,如果还没有找到匹配的 rescue
代码块,则程序会异常终止。
以下是一个简单的 Ruby 异常处理的示例:
begin
# 可能会发生异常的代码块
1 / 0
rescue ZeroDivisionError => e
# 处理 ZeroDivisionError 异常
puts "除数不能为0:#{e.message}"
rescue => e
# 处理其他异常
puts "发生了异常:#{e.message}"
end
上面的代码中,由于 1 / 0
会导致除数为 0 的异常,所以会跳转到第一个 rescue
代码块中执行。如果没有发生异常,则不会执行任何 rescue
代码块。
在 rescue
关键字后面加上异常类型可以指定处理特定类型的异常,如果不指定异常类型则会匹配所有类型的异常。在 rescue
代码块中可以通过 =>
操作符将异常对象赋值给一个变量,方便后续处理。
除了 begin
、rescue
和 end
关键字外,Ruby 还提供了 ensure
关键字,用于指定无论是否发生异常都要执行的代码块。ensure
代码块中的代码会在 rescue
代码块执行完毕后执行,无论是否发生异常。
begin
# 可能会发生异常的代码块
file = File.open('file.txt', 'r')
# 使用 file 进行操作
rescue => e
# 处理异常
puts "发生了异常:#{e.message}"
ensure
# 确保文件被关闭
file.close if file
end
上面的代码中,ensure
关键字用于确保打开的文件被关闭,无论是否发生异常都要执行 file.close
代码。