异常处理的写法

2019-03-12  本文已影响0人  biubiudog

ruby中使用begin rescue end语句描述异常处理

begin
    可能会发生异常的处理
rescue
    发生异常时的处理
end

在ruby中,异常及其相关信息都是被作为对象来处理的,在rescue后面制定变量名,可以获得异常对象。

begin
  可能会发生异常的处理
rescue => 引用异常对象的变量
  发生异常时的处理

即使不指定变量名,ruby也会把异常对象赋值给变量$!
不过把变量名明确写出来会使程序更加易懂。

$! 最后发生的异常(异常对象)
$@ 最后发生的异常的位置信息

异常对象的方法

方法名              意义
class            //异常的种类
message         //异常信息
backtrace      //异常发生的位置信息($@ 与$!.backtrace是等价的)

如果发生异常的方法中没有rescue处理,程序会逆向查找调用者中是否定义了异常处理。

后处理

不管是否发生异常都希望执行的处理,在ruby中可以用ensure关键字来定义。

begin
  有可能发生异常的处理
rescue => 变量
  发生异常后的处理
ensure
  不管是否发生异常都希望执行的处理
end

rescue中使用retry后,begin以下的处理会再做一遍。
retry会隔一段时间后再执行一次,如果该处一直是异常,那么程序就会陷入死循环。

rescue修饰符

表达式1 rescue 表达式 2

等同于

begin
  表达式1
rescue
  表达式2
end

异常处理方法的补充
如果异常处理的范围是整个方法体,也就是说整个方法内的程序都用begin end包含的话,我们就可以省略begin以及end,直接书写rescue和ensure部分的程序。

指定需要捕获的异常

当存在多个种类的异常,且需要按异常的种类分别进行处理时,我们可以用多个rescue来分开处理。

begin
  可能发生的异常
rescue Exception1, Exception2 => 变量
  对Exception1或者Exception2的处理
rescue Exception3
  对Exception3的异常处理
rescue
  对上述异常以外的异常的处理
end

主动抛出异常

使用raise方法,可以使程序主动抛出异常。在基于自己判定的条件抛出异常,或者把刚捕获到的异常再次抛出并通知异常的调用者等情况下,我们会使用raise方法。
raise方法有以下4中调用方式:

上一篇 下一篇

猜你喜欢

热点阅读