娯楽開発

娯楽開発

開発は娯楽。遊び心で開発をすすめるブログ。

【ruby】エラーを想定した分岐処理

先日バッチ処理を書く際にエラーが発生することも想定して処理を書かないといけないシーンに遭遇しました。

今回はその時の方法を覚え書きとしてメモしておきます。

begin - rescue

たとえば

array = [1, 2, "hoge", 4]
array.each do |elm|
  puts 1 + elm
end

のような処理があった場合、実行結果は以下のように"hoge"に対してのエラーで止まってしまい配列array4まで実行することができません。

# 実行結果
2
3
TypeError: String can't be coerced into Fixnum
from (pry):80:in `+'

こんな時に

  1. 正常に動作した場合の処理
  2. エラーが発生した際の処理

を分岐して実行してくれるのが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