プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

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 (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)