Ruby学习-异常处理

异常处理语句

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