Ruby 例外処理の簡単な使い方

  • 作成日 2021.09.29
  • 更新日 2022.07.06
  • Ruby
Ruby 例外処理の簡単な使い方

Rubyで、例外処理の簡単な使い方を記述してます。rubyのバージョンは2.7.2を使用してます。

環境

  • OS windows10 pro 64bit
  • ruby 2.7.2p137

例外処理

rubyは、begin ~ end のブロックで例外を処理することが可能です。

begin
  # 処理
rescue
  # エラーが発生した場合の処理
ensure
  # 必ず行われる処理
end

以下は、正常な処理と、0で割り算してエラーを発生させるサンプルとなります。例外が発生するとrescueに記述されて処理が実行されることが確認できます。

def hoge(x, y)
  begin
    p "開始"
    p x / y
  rescue
    p "エラー発生"
  ensure
    p "必ず実行"
  end
end

hoge(6, 3)
# "開始"
# 2
# "必ず実行"

hoge(1, 0)
# "開始"
# 2
# "必ず実行"

エラー確認

「rescue => e」でエラーの種類を確認することが可能です。

def hoge(x, y)
  begin
    p "開始"
    p x / y
  rescue => e
    p e
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"
# #<ZeroDivisionError: divided by 0>
# "必ず実行"

eオブジェクトはメソッドも持っています。

def hoge(x, y)
  begin
    p "開始"
    p x / y
  rescue => e
    p e.class
    p e.message
    p e.backtrace
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"

# ZeroDivisionError
# "divided by 0"
# ["sample.rb:4:in `/'", "sample.rb:4:in `hoge'", "sample.rb:14:in `<main>'"]

# "必ず実行"

発生する例外ごとに、処理を分けることも可能です。

def hoge(x, y)
  begin
    p "開始"
    p x / y
  rescue ZeroDivisionError
    p "0で割り算を行ってます"
  rescue ArgumentError
    p "引数が間違っています"
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"
# "0で割り算を行ってます"
# "必ず実行"

エラーの種類も、もちろん確認できます。

def hoge(x, y)
  begin
    p "開始"
    p x / y
  rescue ZeroDivisionError => e
    p e
  rescue ArgumentError => e
    p e
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"
# #<ZeroDivisionError: divided by 0>
# "必ず実行"

例外を発生させる

raiseを使用すると任意の例外を発生されることが可能です。

def hoge(x, y)
  begin
    p "開始"
    raise ArgumentError
  rescue ZeroDivisionError
    p "0で割り算を行ってます"
  rescue ArgumentError
    p "引数が間違っています"
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"
# "引数が間違っています"
# "必ず実行"

独自のメッセージを作成することも可能です。

def hoge(x, y)
  begin
    p "開始"
    raise ArgumentError,"ArgumentErrorを発生させます"
  rescue ZeroDivisionError
    p "0で割り算を行ってます"
  rescue ArgumentError => e    
    p e.message    
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"
# "ArgumentErrorを発生させます"
# "必ず実行"

何も指定しなければ「RuntimeError」を発生させます。

def hoge(x, y)
  begin
    p "開始"
    raise 
  rescue ZeroDivisionError
    p "0で割り算を行ってます"
  rescue ArgumentError
    p "引数が間違っています"
  rescue RuntimeError
    p "ランタイムエラーです"
  ensure
    p "必ず実行"
  end
end

hoge(1, 0)
# "開始"
# RuntimeError
# "必ず実行"