Ruby の例外処理を試してみる
Ruby
Published: 2019-04-29

やったこと

Ruby で例外処理について調べてみました。

今回は下記について調べてみます。

  • rescue
  • retry
  • ensure

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

rescue

StandardError 例外クラスのサブクラスだけ捕捉します。

retry

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

ensure

ensure 節が存在する時は begin 式を終了する直前に必ず ensure 節の本体を評価します。

動かしてみる

今回は、メソッドの定義に resuce, ensure を実装してみたいと思います。

クラス/メソッドの定義/クラス定義、クラス/メソッドの定義/モジュール定義、クラス/メソッドの定義/メソッド定義 などの定義文では、それぞれ begin なしで rescue, ensure 節を定義でき、これにより例外を処理することができます。

test.rb

class Sample
  def initialize
    @count = 0
  end

  def output
    @count += 1
    puts 'start'
    puts 1 / 0
    puts 'success'
  rescue => e
    puts 'rescue block'

    if @count > 3
      raise
    end

    retry
  ensure
    puts 'ensure block'
  end
end

s = Sample.new
s.output

出力結果

$ ruby test.rb
start
rescue block
start
rescue block
start
rescue block
start
rescue block
ensure block
Traceback (most recent call last):
	2: from test.rb:26:in `<main>'
	1: from test.rb:10:in `output'
test.rb:10:in `/': divided by 0 (ZeroDivisionError)

処理は4回目の例外発生で終わっていることが分かると思います。

参考