Rubyで例外処理を行うときにわからないことが多すぎたので調べた。
シンプルに
シンプルにbegin
とrescue
を使うパターン。raise
を使うと意図的に例外を出すことができる。
raise
で以下のように例外を出した場合は、例外の種類はRuntimeError
となる。
begin
raise "例外を発生させたい"
rescue => exception
puts exception.class
puts exception.message
puts exception.backtrace
end
実行結果
RuntimeError
例外を発生させたい
test.rb:2:in `<main>'
raise
でRuntimeError
以外のエラーを出したいときには以下のように記述する。同時にメッセージを登録することができる。
begin
raise StandardError.new('例外を発生させたい')
rescue => exception
puts exception.class
puts exception.message
puts exception.backtrace
end
実行結果
StandardError
例外を発生させたい
test.rb:2:in `<main>'
関数内での例外処理
関数内で例外処理を行いたい場合は以下のように記述する。関数内の場合は、begin
のブロックを利用する必要がない。
def test
raise StandardError.new('例外を発生させたい')
rescue => exception
puts exception.class
puts exception.message
puts exception.backtrace
end
test()
実行結果
StandardError
例外を発生させたい
test.rb:2:in `test'
test.rb:9:in `<main>'
関数内の関数で例外が発生した場合には外側の関数で捕捉される。
def exception
raise "関数内での例外"
end
def test
exception()
rescue => exception
puts exception.class
puts exception.message
end
test()
実行結果
RuntimeError
関数内での例外
複数の例外
エラーの種類により処理を分けることができる。以下の例ではStandardError
とRangeError
の時は上のrescue
、それ以外の場合は下のrescue
で捕捉される。
begin
raise StandardError
rescue StandardError, RangeError => exception
puts exception.class
rescue => exception
puts exception.class
end
実行結果
StandardError
ZeroDivisionError
を発生させる
begin
1/ 0
rescue StandardError, RangeError => exception
puts exception.class
rescue => exception
puts exception.class
end
実行結果
ZeroDivisionError
独自のエラー
StandardError
を継承し、独自のエラークラスを作成することができる。
class MyError < StandardError
def initialize(msg="Error Message")
super
end
end
begin
raise MyError.new("エラーです")
rescue => exception
puts exception.class
puts exception.message
end
MyError
エラーです
まとめ
ざっくりとまとめた。雰囲気は掴めた気がする。