# 异常处理语句
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 | 
