2011年5月2日月曜日

rubyで例外処理

rubyでの例外処理方法

javaで言うところのtry-catchに似たbegin-rescueブロックを使用した例外処理ができる。

例外処理の基本

下記コードだと、beginブロック内で発生した例外(StandardError)をrescueブロックで補足して処理をしている。
rubyでは、rescueブロックで例外を指定しないとStandardError(JavaでのRuntimeException)が暗黙的に補足される。
def hoge
  raise RuntimeError, "message"
end

begin     # javaでのtry
  hoge
rescue    # javaでのcatch

  # 補足した例外は、グローバル変数の「$!」で参照できる。
  puts  "error, #{$!.message}"  
end

begin
  hoge
# 例外を捕捉時に例外を変数に格納することも可能
# 下記のように「=> 変数名」とすると、変数に代入することができる。
rescue => exception
  puts "error, #{exception.message}"
end

特定の例外を捕捉

rescueブロックで例外クラスを指定すると特定の例外のみを補足することができる。
複数のrescueブロックを定義した場合、javaと同じように最初にマッチしたrescueブロックが実行される。
def hoge(n)
  raise TypeError, "Type error." unless n.is_a? Integer
  n / 0
end

begin
  hoge(0)
# ZeroDivisionErrorを捕捉
rescue ZeroDivisionError => e
  puts  "error, #{e.message}"
end

begin
  hoge('a')
# TypeErrorを捕捉
rescue TypeError => e
  puts "error, #{e.message}"
end

begin
  hoge('a')
# ZeroDivisionErrorとTypeErrorを捕捉
rescue ZeroDivisionError, TypeError => e
  puts "error, #{e.message}"
end