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
関連ページ
- Ruby
- Ruby_よく使うのに忘れてしまう基本文法の備忘録
- Rubyのクラスについて
- Rubyのモジュールについて
- Rubyの例外処理について
- RubyのKCODEについて
- Rubyの__send__について
- Rubyのyieldについて