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番目にひっかかりました"