Rubyシルバーの試験問題によく出るRubyの例外について。
実行順序
例外が発生する可能性がある箇所をbegin
とend
で囲み、その中のrescure
で記述します。
begin # 例外だったら実行される
↓
rescure # begin節が例外の場合は実行される↔︎begin節が例外ではなかったら実行されない
↓
else # rescure節が実行されなかったら実行else節は実行される↔︎rescure節が実行されたら実行されない
↓
ensure # ensure節は必ず実行される
例
1
2
3
4
5
6
7
8
9
10
11
|
begin
1 / 0
p 1
rescue # `begin`節が実行されなかったので、`rescue`節が実行される
p 0
else
p 2
ensure # 必ず実行される
p 3
end
=> 0, 3
|
1
2
3
4
5
6
7
8
9
10
|
begin # `begin`節が実行
p 1
rescue
p 0
else # `rescue`節が実行されなかったので、`else`節が実行される
p 2
ensure # 必ず実行される
p 3
end
=> 1,2,3
|
例外クラスの階層

例外クラスに続いて=>
で識別子を指定すると、例外オブジェクトを参照できます。
messageメソッド
→ 指定した例外メッセージ
backtraceメソッド
→ 例外発生した場所を参照
1
2
3
4
5
6
7
8
9
10
11
|
# `messageメソッド` → 指定した例外メッセージ
begin
# わざと例外を起こす
10 + nil
# 例外オブジェクトを変数 error に代入
rescue => error
# エラーを表すメッセージを表示
puts error.message
end
=> nil can't be coerced into Integer
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# `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回しか実行されません
1
2
3
4
5
6
7
8
9
10
11
|
a = 0
begin
b = 1 / a
rescue ZeroDivisionError
a += 1
retry
ensure
p b
end
=> 1
|
rescue節の注意点
rescue節は一つのbegin節の中でいくつも指定できます。しかし、最初にマッチしたものしか実行されない。
参考
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで
See Also