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