コンテンツにスキップ

大域脱出

catchthrow

throw が例外の場合の rise に相当し、catchbegin 節に相当する。
throw が実行されると、同名のラベルが指定されている catch まで呼び出しスタックをたどり、見つかった場合は、そのブロック内における後続の処理をスキップする。
ラベルには、シンボル、文字列が指定できる。対応するラベルが見つからない場合は、NameError が発生する。
また、throw にはラベル以外に値を引数として渡すことができる。
throw に渡した値は catch の戻り値にできる。

def foo
  throw :exit
end

catch(:exit) {
  foo
  p 1     # これは実行されない
}
p 2

# => 2
def bar
  catch(:calc) do
    throw :calc, 100
  end
end
p bar

# => 100