Exception 例外
- 全ての例外のスーパークラス
- エラー発生時やraiseした場合にこのクラスのオブジェクトが生成される
自作の例外クラスを作る
class MyError < RuntimeError; end
begin
raise MyError
rescue => e
p e
end
例外オブジェクトを生成するには、newメソッドかexceptionメソッドを使います
エラーメッセージを指定することができる
class MyError < RuntimeError; end
begin
raise MyError.new('hage-!')
rescue => ex
p ex
end
=> #<MyError: hage-!>
class MyError < RuntimeError; end
begin
raise MyError.exception('hage-!')
rescue => ex
p ex
end
#<MyError: hage-!>
結果は一緒に思えるんだけど、何が違うのか、どれを使うのがナウいのか分からん
raise MyError, ‘hage-!’ |
raise MyError.new(‘hage-!’) |
raise MyError.exception(‘hage-!’) |
なんとなくnewでいいかなーとは思ってるんだけど
raise MyError, 'hage-!'
MyError: hage-!
raise MyError.new('hage-!')
MyError: hage-!
raise MyError.exception('hage-!')
MyError: hage-!
例外オブジェクトに設定されているメッセージの取得
exception#message exception#to_s メソッドで取得ができる
class MyError < RuntimeError; end
begin
raise MyError.exception('hage-!')
rescue => ex
p ex.message
p ex.to_s
end
"hage-!"
"hage-!"
例外オブジェクトのバックトレースの取得
exception#backtrace メソッドで配列で取得ができる
class MyError < RuntimeError; end
begin
raise MyError.exception('hage-!')
rescue => ex
p ex.backtrace
end
=> ["(irb):......."] # 大量の配列
バックトレースの設定
それまでのバックトレースは上書きされてしまう
class MyError < RuntimeError; end
begin
raise MyError.exception('hage-!')
rescue => ex
ex.set_backtrace('backtrace 1')
p ex.backtrace
end
=> ["backtrace 1"]
class MyError < RuntimeError; end
begin
raise MyError.exception('hage-!')
rescue => ex
ex.set_backtrace(['backtrace 1', 'backtrace 2'])
p ex.backtrace
end
=> ["backtrace 1", "backtrace 2"]
class MyError < RuntimeError; end
begin
raise MyError.exception('hage-!')
rescue => ex
ex.set_backtrace(['backtrace 1', 'backtrace 2'] + ex.backtrace)
p ex.backtrace
end
=> ["backtrace 1", "backtrace 2", "(irb):......."] # 大量の配列