例外処理の書き方
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
や、捕捉すべき出ない例外を捕捉しない。上記を守らないとかえって問題の多いプログラムになってしまうとのこと。
なので、例外発生が予想できる処理であれば、基本的には例外処理よりも条件分岐で対応できるようにする。
予期しないものは、上のコードのように例外を発生させて、エラーメッセージとバックトレースを残して原因調査ができるようにする。