# 异常处理语句
Ruby 使用 begin~rescue~end 语句描述异常处理,类似于 Java 中的 try~catch 块
begin | |
可能发生发生异常异常的代码 | |
rescue | |
发生异常时的处理 | |
end |
rescue 后面可以指定一个变量名,用于获取异常对象
begin | |
.... | |
rescue => 引用异常对象的变量 | |
.... | |
end |
即使在 rescue 后不指定变量名,Ruby 也会把异常对象赋值给变量 $!
异常发生时被自动赋值的变量
变量 | 作用 |
---|---|
$! | 最后发生的异常(异常对象) |
$@ | 最后发生的异常的位置信息 |
异常对象的方法
方法名 | 作用 |
---|---|
class | 获取异常的种类 |
message | 获取异常信息 |
backtrace | 获取异常发生的位置信息(!.backtrace 等价) |
# 后处理
不管是否发生异常都希望进行的处理,可以放在 ensure 关键字之后,
类似 Java 中 try~catch~finally 中的 finally,一般由于资源的释放等
begin | |
可能发生异常的代码块 | |
rescue => ex | |
发生异常后的处理 | |
ensure | |
不管是否发生异常都会执行的处理 | |
end |
# 重试
Ruby 中支持异常重试,这和 Java、C、Rust 中的异常处理方式是不同的
可以在 rescue 后的代码块中使用 retry 语句,让 Ruby 从头开始执行 begin 块
在 rescue 中使用 retry 进行异常重试时要注意避免陷入死循环的情况
begin | |
可能发生异常的代码块 | |
rescue | |
retry # 重头执行 begin 代码块 | |
end |
# 指定需要捕捉的异常
Ruby 中所有异常都是 Exception 类的子类
begin | |
... | |
rescue exception1, exception2 => ex1 | |
对exception1或exception2的处理 | |
rescue exception3 => ex2 | |
对exception3的处理 | |
rescue | |
对上述异常以外的异常进行的处理 | |
ensure | |
... | |
end |
# 手动抛出异常
Ruby 中使用 raise 进行手动抛出异常,类似于 Java 中的 throw
# raise 方法的调用方式 | |
# 1、抛出 RuntimError 异常,并把 message 设置给异常对象 | |
raise message | |
# 2、抛出指定的异常 | |
raise 异常类 | |
# 3、抛出指定的异常,并将 message 设置给异常对象 | |
raise 异常类 message | |
# 4、在 rescue 外抛出 RuntimeError,在 rescue 中调用时,会再次抛出最后一次发生的异常 | |
raise |