# 异常处理语句

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,一般由于资源的释放等

ensure关键字使用
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
更新于 阅读次数