📚
Ruby の retry について
Ruby のマイナー機能シリーズです。
retry
は rescue
で使用すると『 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
した場合はどうなる?
ブロックで ブロックの rescue
で retry
した場合はブロックの最初から再開されます。
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
に近いですね。
Discussion