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