Ruby試験 例外

Rubyシルバーの試験問題によく出るRubyの例外について。

実行順序

例外が発生する可能性がある箇所をbeginendで囲み、その中のrescureで記述します。

begin # 例外だったら実行される

rescure # begin節が例外の場合は実行される↔︎begin節が例外ではなかったら実行されない

else # rescure節が実行されなかったら実行else節は実行される↔︎rescure節が実行されたら実行されない

ensure # ensure節は必ず実行される

begin
  1 / 0
  p 1
rescue # `begin`節が実行されなかったので、`rescue`節が実行される
  p 0
else
  p 2
ensure # 必ず実行される
  p 3
end
=> 0, 3
begin  # `begin`節が実行
  p 1
rescue
  p 0
else   # `rescue`節が実行されなかったので、`else`節が実行される
  p 2
ensure # 必ず実行される
  p 3
end
=> 1,2,3





例外クラスの階層

Ruby試験 例外





例外クラスに続いて=>で識別子を指定すると、例外オブジェクトを参照できます。

messageメソッド → 指定した例外メッセージ

backtraceメソッド → 例外発生した場所を参照

# `messageメソッド` → 指定した例外メッセージ
begin
  # わざと例外を起こす
  10 + nil
# 例外オブジェクトを変数 error に代入
rescue => error
  # エラーを表すメッセージを表示
  puts error.message
end

=> nil can't be coerced into Integer
# `backtraceメソッド` → 例外発生した場所を参照
begin
  # わざと例外を起こす
  10 + nil
# 例外オブジェクトを変数 error に代入
rescue => error
  # エラーを表すメッセージを表示
  puts error.backtrace
end

=> exam.rb:3:in `+'
   exam.rb:3:in `<main>'





retry

retryはrescue 節でbegin式をはじめからもう一度実行するのに使用します。retry を使うことである処理が成功するまで処理を繰り返すようなループを作ることができます。 ensure節は1回しか実行されません

a = 0

begin
  b = 1 / a
rescue ZeroDivisionError
  a += 1
  retry
ensure
  p b
end
=> 1





rescue節の注意点

rescue節は一つのbegin節の中でいくつも指定できます。しかし、最初にマッチしたものしか実行されない。





参考

See Also