やったこと
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回目の例外発生で終わっていることが分かると思います。