详解ruby中的异常处理

作者:周星 发布:2014-07-04

       ruby 有一套完整的异常处理机制,使用关键词 begin、rescue、ensure、raise,再配合 retry、else等,即可实现你想达到的一切目标,而且十分简单,现在我们就来看一下如何使用他们。

begin:

我们把可能产生异常的代码放到 BEGIN 块中

rescue:

捕获 BEGIN 中执行的代码可能抛出的异常,默认参数为 StandardError。

ensure:

无论是否捕获到异常,ENSURE 块里的代码都会被执行

raise:

抛出一个指定的异常,程序的执行会中断

retry:

在 rescue 里声明 retry,则重新执行一次 begin 中的代码块

我们先看一个例子:

#!/usr/bin/ruby

arr = [0, 1, 2]
i = 3
begin
  arr.each do |e|
    100 / e
  end
rescue StandardError => e
  i -= 1
  puts e.message
  retry if i > 0
ensure
  puts "I will be execute"
end

执行的结果如下:

➜  ruby  ruby begin.rb
divided by 0
divided by 0
divided by 0
I will be execute
➜  ruby

     divided by 0 即是异常的信息,之所以打印出了三次,是因为我们先执行了一次,然后 retry 了两次,最后 i = 0 时不再 retry,开始执行 ensure 里的代码。ruby 异常的层级如下:

Exception  
 NoMemoryError  
 ScriptError  
   LoadError  
   NotImplementedError  
   SyntaxError  
 SignalException  
   Interrupt  
 StandardError  
   ArgumentError  
   IOError  
     EOFError  
   IndexError  
   LocalJumpError  
   NameError  
     NoMethodError  
   RangeError  
     FloatDomainError  
   RegexpError  
   RuntimeError  
   SecurityError  
   SystemCallError  
   SystemStackError  
   ThreadError  
   TypeError  
   ZeroDivisionError  
 SystemExit  
 fatal

当然我们也可以实现一个自己的异常类,只需要继承 StandardError。另外我们可以指定多个 rescue 来捕获不同的异常,只不过这种情况比较少见。

通过 else 关键词,我们可以指定如果没有捕获到异常时我们可以做什么

#!/usr/bin/ruby

begin
   # 执行代码
rescue Error1      # 捕获异常1
   # 处理异常1
rescue Error2      # 捕获异常2
   # 处理异常2
else
   # 没有捕获到异常时执行的代码
ensure
   # 一定会执行到的代码
end

如果你掌握了上面的知识,你就基本可以熟练的使用 ruby 中的异常了。

支付宝扫码赞助博主


评论(0)