shou.com
JP / EN

Ruby試験 例外

Tue Aug 14, 2018
Tue Aug 14, 2018

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

実行順序

例外が発生する可能性がある箇所をbeginendで囲み、その中の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

例外クラスの階層

Ruby試験 例外

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

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