Rubyでの例外エラー処理

例外処理

Rubyでは、以下の通り例外処理を定義します。


begin
 # メソッド:例外が発生する可能性のある処理
rescue => 例外オブジェクト格納先変数
 # 例外処理:例外時のみ実行する処理
ensure
 # 後処理:例外の有無に関わらず実行する処理
end

例外のオブジェクト

Rubyでは例外がオブジェクトとして扱われますので、「rescue」の後に変数名を指定することで例外オブジェクトを取得できます。

変数を指定せずとも以下の変数名で情報が参照できますが、一般的には変数で明示することが望ましいです。

$! (最後に発生した)例外オブジェクト
$@ 例外が発生した位置情報


begin
  raise "hoge"
rescue => e
  p $@
  p e.backtrace
  p $!.inspect
  $@.each {|x| print(x)}
end


例外時の再実行

rescueで「retry」キーワードを記述すると、begin以下を再実行します。

ただし、例外が発生し続けると無限ループになる可能性があります。


begin
  # 処理
rescue
  # 例外処理
  retry
end

指定例外を捕捉する

複数の例外を個別に対処する場合には、rescueを複数記述します。


begin
  # 処理
rescue Errno::ENOENT, Errno::EACCES => ex
  # 個別の例外処理
rescue => ex
  # その他例外処理
end

例外クラス

全て例外は「Exception」クラスのサブクラスとなっており、エラー種類に対応した例外が定義されています。


自分で例外クラスを定義する場合には、「StandardError」クラスを継承することが一般的といえます。


class MyError < StandardError; end
class SampleError < MyError; end

raise(例外を発生させる)

意図的に例外を発生させるには「raise」メソッドを利用します。


def raise_exception
  raise ArgumentError, "wrong number of argument"
  # 以降の処理は実行されない
end

catch/throw

実行順の制御メソッドとしてcatch/throwがあります。

catch() が受け手で throw() が投げ手としての役割を持っています。

catchブロックから同シンボルのthrowを呼ぶと、catchブロックを終了します。



def test_throw
  throw :test
end

catch(:test) do
   puts "catchブロックが実行されます。"
   test_throw
   puts "throwされたので、実行されません。"
end


関連ページ