【ruby】エラーを想定した分岐処理
先日バッチ処理を書く際にエラーが発生することも想定して処理を書かないといけないシーンに遭遇しました。
今回はその時の方法を覚え書きとしてメモしておきます。
begin - rescue
たとえば
array = [1, 2, "hoge", 4] array.each do |elm| puts 1 + elm end
のような処理があった場合、実行結果は以下のように"hoge"
に対してのエラーで止まってしまい配列array
の4
まで実行することができません。
# 実行結果 2 3 TypeError: String can't be coerced into Fixnum from (pry):80:in `+'
こんな時に
- 正常に動作した場合の処理
- エラーが発生した際の処理
を分岐して実行してくれるのがbegin
- rescue
構文です。
array = [1, 2, "hoge", 4] array.each do |elm| begin puts 1 + elm rescue => error puts error end end
このようにすることでbegin
で実行中の処理でエラーが起きるとrescue
以下の処理が実行され、全体の処理を中断することなく処理を進めることができます。
結果、以下のようにエラーが発生しても最後まで実行することができます。
# 実行結果 2 3 String can't be coerced into Fixnum 5
ちなみにrescue
時にputs error.backtrace
とするとエラー出力のバックトレース情報を返すことができます。
begin - rescue - ensure
エラーが発生してもしなくても実行したい処理がある場合はensure
を使います。
array = [1, 2, "hoge", 4] array.each do |elm| begin puts 1 + elm rescue => error puts error ensure puts "elm = #{elm}" end end
この場合begin
もしくはrescue
を通過した処理は最終的にensure
を通過して終了します。
# 実行結果 2 elm = 1 3 elm = 2 String can't be coerced into Fixnum elm = hoge 5 elm = 4