Help us understand the problem. What is going on with this article?

【Ruby】例外処理まとめ

概要

Rubyの例外処理に関して最低限必要な知識を簡単なコードと共にまとめました。

基本文法

例外処理の基本は以下の様な形式になります。

begin 
  # エラーを発生させる可能性のあるコード。
rescue => e # 例外オブジェクトを代入した変数。
  # begin~rescueの間でエラーが発生した場合に実行されるコード。
end

コード例

begin 
  raise # エラーを発生させます。
rescue => e
  p e #=> RuntimeError
end

関連メソッド

Method Explanation
Object#class エラーのクラスを返します。
Kernel#raise エラーを発生させます。
Exception#backtrace エラーのバックトレースを返します。
Exception#message エラーのメッセージを返します。

コード例

begin 
  raise StandardError.new("Message")
rescue => e
  p e.class #=> StandardError
  p e.message #=> "Message"
  p e.backtrace #=> ["(repl):4:in `<main>'", "/run_dir/repl.rb:41:in `eval'", "/run_dir/repl.rb:41:in `run'", "/run_dir/repl.rb:57:in `handle_eval'", "/run_dir/repl.rb:170:in `start'", "/run_dir/repl.rb:177:in `start'", "/run_dir/repl.rb:181:in `<main>'"]
end

Ensure

ensureを使用する事でエラーの有無に関わらず処理を実行する事ができます。

コード例1(エラーがない場合)

begin 
  "no Error"
rescue => e
  p e.message # エラーはないので実行されません。
ensure 
  p "絶対実行" #=> 絶対実行
end

コード例2(エラーが発生した場合)

begin 
  raise StandardError.new('error')
rescue => e
  p e.message #=> error
ensure 
  p "絶対実行" #=> 絶対実行
end

Retry

文字通り処理を再実行します。

コード例

file = ARGV[0]

begin
  io = File.open( file )
rescue
  # ファイルを開く際にエラーが発生した場合は処理が行われる。
  sleep( 10 )
  # begin ~ rescue内の処理を再び実行します。
  retry
end

Rescue修飾子

if修飾子のように rescueを修飾子として使用する事ができます。

コード例

raise "Error" rescue p "rescued" #=> rescued

メソッド内の例外

メソッド内ではbeginendを省略して以下のように書く事ができます。

def method
  # エラーを発生させる可能性のあるコード。
 rescue => e 
  # エラー発生時の処理。
end

コード例

def method
 raise 'error'
 rescue => e 
  p e.message #=> error
 ensure
  p 'ensured' #=> ensured
end
method #=> "error"

複数の例外処理

以下のように対応するエラー毎に複数のrescueを記載する事で、各エラー毎に別の対応をする事ができます。

begin 
  rescue Exception1, Exception2 => e
  # Exception1 か Exception2が発生した際に処理が実行される。
  rescue Exception3 => e
  # Exception3が発生した際に処理が実行される。
  rescue => e
   # Exception1,2,3以外の例外が発生した際に処理が実行される。
end

コード例

begin 
  raise StandardError
  rescue StandardError, RangeError   
    p 'Standard or Ranage Error'
  rescue RuntimeError
    p 'Runtime Error'
  rescue => e
    p 'some other error'
end

#=> "Standard or Ranage Error"

カスタム例外の作成

以下の記事にカスタム例外の作成方法をまとめました。
【Ruby】カスタム例外を作成する簡単3ステップ - Qiita

参照

Ruby Exception handling - DEV Community 👩‍💻👨‍💻

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away