LoginSignup
1
0

More than 3 years have passed since last update.

【Ruby】関数における例外処理

Last updated at Posted at 2020-09-09

はじめに

この記事は数多ある例外処理についての補足的なものです。具体的には、記事で紹介されてないパターンについて検証した結果を残します。

環境

  • 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を先に書くと大体のエラー処理はこいつがやってしまいます。なので子クラスから書いていきましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0