mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - 例外発生時 retry 回数指定!

[ プログラミング ] [ Ruby ]

こんばんは。

Ruby で例外発生時には処理を中止(exit)したり、リトライ(retry)したりすると思います。

特に、たまたま処理に失敗するような場合は、再度同じ処理を流す為に rescue 節に retry を記述します。

しかし、これは1度しか retry されません。 1度 retry してもまた失敗するかもしれないことだって考えられます。 (もちろん、明らかに失敗する処理は何回 retry しても無意味なので、exit にしますが)

以下、retry 回数を指定する方法についてのメモです。

記録

0. 前提条件

  • Cygwin 1.7.15
  • Ruby 1.9.3-p194

1. サンプルスクリプト・1

begin より前にカウンタを定義・初期化し、例外が発生する度にカウンタをインクリメントし、制限回数未満なら retry する、という例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def test_retry
  # リトライ回数
  cnt_retry = 0

  begin
    #
    # 何らかの処理
    #
  rescue
    # カウンタインクリメント
    cnt_retry += 1
    # 4回までリトライする
    retry if cnt_retry < 5
  end
end

2. サンプルスクリプト・2

Ruby では、メソッド内が全て begin 節の場合は、begin と対になる end は省略可能です。 そのような場合は、リトライ回数はメソッド内で定義できません。 以下のように、メソッドの引数で与えることで対応可能です。

1
2
3
4
5
6
7
8
9
10
def test_retry( cnt_retry = 0 )
  #
  # 何らかの処理
  #
rescue
  # カウンタインクリメント
  cnt_retry += 1
  # 4回までリトライする
  retry if cnt_retry < 5
end

最初にも述べたが、明らかに例外となる処理では何度リトライしても無意味です。 終了させずにリトライさせた方が効率的な場合には使えると思います。 当方も、HTML 取得時にたまたま “404 エラー” が出る局面等で活用しています。

以上。

Comments