[Ruby] rescue 節で retry を用いると begin 以下を再度実行してくれる

memo.

リトライで begin 節から再度実行する

retry は、rescue 節で begin 式をはじめからもう一度実行するのに使用します。 retry を使うことである処理が成功するまで処理を繰り返すようなループを作 ることができます。

num_attempts = 0
begin
  num_attempts += 1
  raise
rescue
  sleep 3
  puts "Retry #{num_attempts}"
  retry
ensure
  puts '終了'
end

強制終了させるまで止まらない。

指定回数リトライしてエラーを発生させる

強制終了させるまで無限ループになってしまうので、指定回数のリトライでエラーを発生させる。

MAX_ATTEMPTS = 3
num_attempts = 0
begin
  num_attempts += 1
  raise
rescue => e
  if num_attempts <= MAX_ATTEMPTS
    sleep 1
    puts "Retry #{num_attempts}"
    retry
  else
    puts e
    raise
  end
ensure
  puts '終了'
end

XMLRPC::FaultException をキャッチしてリトライする

この場合は、XMLRPC::FaultException を catch して retry すればよいということになる。

Error: 0: Failed to invoke method switchStatus in class jp.co.nulab.backlog.service.XmlRpcService: "statusId" is invalid. May be other user has updated status.

具体的なコードサンプル。

補遺