0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyの例外について無知だったのでざっくりとまとめた

Last updated at Posted at 2020-02-19

Rubyで例外処理を行うときにわからないことが多すぎたので調べた。

シンプルに

シンプルにbeginrescueを使うパターン。raiseを使うと意図的に例外を出すことができる。
raiseで以下のように例外を出した場合は、例外の種類はRuntimeErrorとなる。

begin 
  raise "例外を発生させたい"
rescue => exception
  puts exception.class
  puts exception.message
  puts exception.backtrace
end

実行結果

RuntimeError
例外を発生させたい
test.rb:2:in `<main>'

raiseRuntimeError以外のエラーを出したいときには以下のように記述する。同時にメッセージを登録することができる。

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
関数内での例外

複数の例外

エラーの種類により処理を分けることができる。以下の例ではStandardErrorRangeErrorの時は上の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
エラーです

まとめ

ざっくりとまとめた。雰囲気は掴めた気がする。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?