ensure節の値は無視されます。

今日のハマり。

制御構造 – Rubyリファレンスマニュアル

begin式全体の評価値は、本体/rescue節/else節のうち 最後に評価された文の値です。また各節において文が存在しなかったときの値 はnilです。いずれにしてもensure節の値は無視されます。

たとえばこんなことしてました。

  1 Foo.find(:all).inject(0) do |num_processed, foo|
2   begin
3     foo.bar                        # ここでraise
4     num_processed += 1
5   rescue => evar
6     logger.error(evar.message)
7   ensure
8     num_processed
9   end
10 end

8行目をensureの外に出して解決した。

コメント

  1. Yugui より:

    1 Foo.find(:all).inject(0) do |num_processed, foo|
    2 begin
    3 foo.bar # ここでraise
    4 num_processed += 1
    5 rescue => evar
    6 logger.error(evar.message)
    7 ensure
    8 next num_processed
    9 end
    10 end

    とか。

  2. yoshuki より:

    うわーnextっ!
    はずかしー、ありがとうございまっす!

タイトルとURLをコピーしました