コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyのraiseはエラーの指定を省略すると直前の例外を再度raiseさせる

知らなかった仕様

検証した環境

$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19]

出典

例外を発生させます。第一の形式(引用注:raise のみの記述のこと)では直前の例外を再発生させます。 - 制御構造 (Ruby 3.1 リファレンスマニュアル)

というようになっているので、raiseは引数を省略させると同じエラーを発生させる

実例

raiseの直後にraiseを呼ぶというのはrescue句以外だとつかわない、もとよりできないと思うのでrescueの場合の例を記述する。

以下の内容で test.rb をつくる

def demo_raise(happen_exception)
  raise StandardError, "これはエラーです" if happen_exception
  return true
end

begin
  demo_raise(true)
rescue
  p "catch exception"
  raise
end

これを実行すると以下のようになる

$  ruby test.rb
"catch exception"
test.rb:2:in `demo_raise': これはエラーです (StandardError)
        from test.rb:7:in `<main>'

raiseには何も指定していないのに直前のエラーを出している。ただし ensure や ブロックの外だと拾ってもらえないので気をつける

関連リンク