Ruby勉強

インターネットの企画職な人がプログラミングを勉強するブログ

Ruby例外#2 - Silver/Gold試験対策

Kernelモジュールにraiseメソッドがあり、エラーを発生させることができる

raise ZeroDivisionError #=> ZeroDivisionError
# エラークラスを指定しない場合はRuntimeError
begin
  raise
rescue => e
 p e
end #=> RunTimeError
raise ZeroDivisionError, "0で割り算したときに出ます" #=> 0で割り算したときに出ます (ZeroDivisionError)

begin節で通常処理。rescue節ではエラー時の処理を記載できる

# foo.rb
begin
  puts "通常処理を始めます"
  puts "Hello, World!"
  raise StandardError
rescue => e
  puts  "エラー発生、エラーのクラス名は #{e.class}"
end
$ ruby foo.rb
通常処理を始めます
Hello, World!
エラー発生、エラーのクラス名は StandardError

rescue節でエラークラスを未指定の場合、begin節でそのStandardErrorクラスが発生した場合とそのサブクラスが発生した場合にrescue節が実行される。

# foo.rb
begin
  puts "通常処理を始めます"
  puts "Hello, World!"
  1/0
rescue => e
  puts  "エラー発生、エラーのクラス名は #{e.class}"
end
$ ruby foo.rb
通常処理を始めます
Hello, World!
エラー発生、エラーのクラス名は ZeroDivisionError

メソッドやクラス内ではbeginもendも省くことができる

def hoge
  1/0
rescue => e
  puts e.class
end
hoge #=> ZeroDivisionError

rescue節は複数記載できるが、最初にひっかかったものが実行される。 ZeroDivisionErrorはStandardErrorのサブクラスなので1番目に引っかかることになる

begin
  1/0
rescue StandardError
  puts "1番目にひっかかりました"
rescue ZeroDivisionError
  puts "2番目にひっかかりました"
end #=> "1番目にひっかかりました"