throw/catch
throw/catchはKernelのメソッド。
# Kernel のメソッドであることがわかるように、明示的に Kernel.(...) の形で呼んでいる
Kernel.catch :error do
puts "hoge"
Kernel.throw :error
puts "fuga"
end
#=> hoge
throwで投げることができるのは任意のオブジェクト。throwで投げたものがcatchで指定したものとequal?の意味で等しければ、catchの引数にあるブロックから脱出する。
raise/rescue
こっちが通常の例外処理に使われる。
raiseはKernelのメソッドだが、rescueと後述するbegin, else, ensureはメソッドではないRubyの構文。
begin
puts "hoge"
Kernel.raise RuntimeError, "an error occurred"
rescue RuntimeError
puts "error caught"
else
puts "no error"
ensure
puts "this must be evaluated"
end
#=>
# hoge
# error caught
# this must be evaluated