はじめに
この記事は数多ある例外処理についての補足的なものです。具体的には、記事で紹介されてないパターンについて検証した結果を残します。
環境
- Mac
- Ruby 2.6.3
関数の中での使用
関数の中では以下のように書けます。
def method
puts "hoge"
a = 1 / 0
rescue ZeroDivisionError
puts $!
end
begin, endを省いた形ですね。このような形の場合、
a = 1 / 0
がエラーを発生させるであろうことは一目瞭然です。しかし、以下の場合であればどうでしょうか。
def method
# 膨大な処理1
# エラーが発生しそうな処理
# 膨大な処理2
rescue StandardError
puts $!
end
さて、このコードを見た人がすぐにエラーの発生しそうな処理を見抜けるかというと怪しいところです(メソッド分割しろや、という話は事情があって無理だという前提で)。その場合はあえてbegin, endを書いたらいいと思います。
def method
# 膨大な処理1
begin
# エラーが発生しそうな処理
rescue StandardError
puts $!
end
# 膨大な処理2
end
こうすればどこがエラー発生しそうか分かりますし、沢山スクロールしてrescueを見に行く必要もありません。
ちなみにrescueでreturnすると膨大な処理2は処理されないので、間違いなく処理してほしいならensureに入れましょう。
def method
# 膨大な処理1
begin
# エラーが発生しそうな処理
rescue StandardError
puts $!
return
ensure
# 膨大な処理2(rescueにreturnがあっても処理される)
end
end
もしエラーの発生しそうな処理が複数ある場合は、関数の最後にまとめて書くのがシンプルでいいと思います。毎回begin, rescue, end書くのは流石に可読性下がりますので。何事も適切に。
def method
# いろいろエラーが発生しそうな処理
# その他処理
rescue ZeroDivisionError, ArgumentError
puts $!
rescue StandardError
puts $!
puts $@
end
ちなみにStandardErrorを先に書くと大体のエラー処理はこいつがやってしまいます。なので子クラスから書いていきましょう。