Rubyで例外を捕捉する


例外を捕捉して処理を続行する場合

もっとも単純な構文

ruby.rb
begin
 # 例外が起きうる処理
rescue
 # 例外が発生した場合の処理
end

例外オブジェクトから情報を取得する

Rubyでは発生した例外もオブジェクトであるため、例外オブジェクトのメソッドを呼び出すことで、発生した例外に関する情報を取得することができる。代表的なものとして例外発生時のエラーメッセージを返すmessageメソッドとメソッド呼び出し履歴を配列で返すbacktraceメソッドがある。
こんな感じの構文

ruby.rb
begin
 # 例外が起きうる処理
rescue => 例外オブジェクトを格納する変数(e,exがよく使われる)、捕捉したい例外クラス
 # 例外が発生した場合の処理
end

具体例

ruby.rb
begin
 1 / 0
rescue => e
 puts "エラークラス: #{e.class}"
 puts "エラーメッセージ: #{e.message}"
 puts "バックトレース ----"
 puts e.backtrace
 puts "----"
end

#こんなエラーが帰ってくる
エラークラス: ZeroDivisionError
エラーメッセージ: divided by 0
バックトレース ----
(irb):2:in '/'
(irb):2:in 'irb_binding'
省略/irb:11:in '<main>' 

例外クラスの継承関係

Rubyではすべての例外クラスはExceptionクラスを継承している。その下にたくさんのサブクラスがぶら下がっている。ここで重要になるのがExceptionクラスの下にあるStandardErrorとそれ以外の例外クラスの違いを理解すること。
StandardErrorは通常のプログラムで発生する可能性の高い例外を表すクラスです。これのサブクラスとしてNoMethodErrorやZeroDivisionError、StandardErrorクラスが含まれている。
StandardErrorクラスを継承していないものは、通常のプログラムでは発生しない特殊なエラーが起きていることを表す。
rescue節に何もクラスを指定しなかった場合に捕捉されるのはStandardErrorとそのサブクラスです。StandardErrorを継承していない例外クラスは捕捉されない。

ruby.rb
begin
 # 例外が起きそうな処理
rescue
 # StandardErrorとそのサブクラスのみ捕捉される
end