异常处理的写法
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中调用方式:
- raise message 抛出
RunTimeError
异常,并把字符串作为message
设置给新生成的异常对象。 - raise 异常类
抛出指定的异常 - raise异常类,message
抛出指定的异常,并把字符串作为message
设置给新生成的异常对象。 - raise
在rescue
外抛出RunTimeError
。在rescue
中调用时,会再次抛出最后一次发生的异常($!)。