チェリー本:例外処理の概要

例外処理の書き方

begin
  # 例外が起きうる処理
rescue
  # 例外が発生した場合の処理
  retry # 処理をやり直す場合に記述する。
        # begin説の頭からリトライする。通常リトライ回数の制限などを入れる
else
  # 例外が発生しなかった場合の処理※begin説に入れてしまうことが多い
ensure
  # 例外の有無に関わらず実行する処理
end

rescueの部分をrescue 捕捉したい例外クラスにしてあげると、捕捉する例外を限定することもできる。

rescure節は複数書くことができるが、実行されないrescue節ができないように、例外クラスのスーパークラスよりもサブクラスを先に捕捉する順番でコードを記述する。

意図的に例外を発生させる方法

意図的に例外を発生させたいときは、raiseメソッドを用いる。下記のように、原因を特定しやすいようなエラーメッセージをつけておく。

def currency_of(country)
  case country
  when :japan
    'yen'
  when :us
    'dollar'
  else
    raise "無効な国名です。#{country}" # 例外クラスを渡さない場合は、RunTimeError
    # raise ArgumentError, "無効な国名です。#{country}" # 例外クラスを渡すこともできる
  end
end

例外処理のベストプラクティス

例外処理は『ここぞ!』という時にのみ使う機能で、やみくもにrescueや、捕捉すべき出ない例外を捕捉しない。上記を守らないとかえって問題の多いプログラムになってしまうとのこと。

なので、例外発生が予想できる処理であれば、基本的には例外処理よりも条件分岐で対応できるようにする。

予期しないものは、上のコードのように例外を発生させて、エラーメッセージとバックトレースを残して原因調査ができるようにする。