📚

Ruby の retry について

2024/02/04に公開

Ruby のマイナー機能シリーズです。
retryrescue で使用すると『 begin からもう1度処理を実行し直す』という挙動になります。

# 1回目に呼ばれたときだけ例外を飛ばすメソッド
def func
  unless @ok
    @ok = true
    raise "NG"
  end
end

begin
  puts "start"

  func

  puts "end"
rescue => e
  pp e
  # begin の先頭まで処理が戻る
  retry
end
__END__
output:
start
#<RuntimeError: NG>
start
end

こんな感じで『例外が発生しなくなるまで』繰り返したい場合などに利用できますね。

ブロックで rescue した場合はどうなる?

ブロックの rescueretry した場合はブロックの最初から再開されます。

def func
  unless @ok
    @ok = true
    raise "NG"
  end
end

proc do
  # ここから再開する
  puts "start"

  func

  puts "end"
rescue => e
  pp e
  # begin の先頭まで処理が戻る
  retry
end.call
__END__
output:
start
#<RuntimeError: NG>
start
end

この挙動だけみると redo に近いですね。

GitHubで編集を提案

Discussion