Rubyにおける例外処理まとめ
苦手なのでRubyの例外処理まとめます
raiseでエラーを表示させます
raise 'error' #=>RuntimeError: error
beginで例外を捕捉します。beginは例外が発生しそうな箇所に使用します
begin 1/0 rescue = e puts e.message #=>divided by 0 puts e.class #=>ZeroDivisionError end
beginで囲んだ部分をrescueで捕捉します。変数eには例外オブジェクトが代入されますので、例外の情報をメソッドを用いて確認できます。
また、rescue節では指定がなければStandardErrorとそのサブクラスの例外を捕捉します。
rescue Exception => e
このように例外オブジェクトを指定することで、StandardErrorのサブクラス以外すべてのエラーを捕捉することができます。
例外は複数捕捉することができる
以下のように複数のエラーにわたり例外処理を施すことができます。この場合、最初にクラスがマッチしたrescue節が実行されます。
begin do_process rescue LoadError => e #例外処理 rescue ArgumentError => e #例外処理 rescue NameError,SyntaxError => e #=>一度に2つの例外クラスを指定することもできる #例外処理 end
rescueを修飾子のように扱う
後置rescueの場合、例外が発生した際にはrescueに渡した式の値が戻り値がになる。ただし、この処理は例外オブジェクトを指定することはできず、StandardError以下のサブクラスのみとなる。
1/0 rescue false => false
例外の後処理
ensureとelse節で後処理ができます。
- ensure ・・・例外の有無にかかわらず必ず発生させる処理
- else・・・例外が発生しなかった場合に限り発生させる処理
メソッドやクラス定義で例外を捕捉する
メソッドやクラスも定義時に発生する例外処理をひっかけることができます。
class Whatever # do_something rescue # do_something else # do_something ensure # do_something end
例外発生時にリトライする
例外が発生した際にリトライします。条件をつけないと無限ループしてしまうので回数制限を入れています。
begin failed ||= 0 puts "trying" process! #=>例外が発生するかもしれない処理 rescue failed += 1 retry if failed < 5 end
retryで例外発生箇所を繰り返します。5回までリトライする例です。
まとめ
beginでかこんでrescue,ensure,retryで処理を継続できます。エラーをエスケープする処理を考えながら、エラーログを溜め込めるよう処理上の工夫が必要そうです。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (14件) を見る