Rubyシルバーの試験問題によく出るRubyの例外について。
例外が発生する可能性がある箇所をbegin
とend
で囲み、その中の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
例外クラスに続いて=>
で識別子を指定すると、例外オブジェクトを参照できます。
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はrescue 節でbegin式をはじめからもう一度実行するのに使用します。retry を使うことである処理が成功するまで処理を繰り返すようなループを作ることができます。 ensure節は1回しか実行されません
a = 0
begin
b = 1 / a
rescue ZeroDivisionError
a += 1
retry
ensure
p b
end
=> 1
rescue節は一つのbegin節の中でいくつも指定できます。しかし、最初にマッチしたものしか実行されない。
参考