【Ruby】カスタム例外の作成と利用に関する基礎知識

Ruby

カスタム例外を作成する際はStandardErrorを継承する

カスタム例外はStandardErrorを継承することで定義できます。
以下は一番シンプルなカスタム例外クラスの定義方法と利用方法の例です。

example.rb

# カスタム例外の定義
class CustomizedError < StandardError; end

# カスタム例外の利用
begin
  raise CustomizedError
rescue CustomizedError
  p 'エラー発生'
end

実行結果

$ ruby example.rb
# エラー発生

第一引数はほかの例外クラスと同様にエラーメッセージとして利用される

Rubyの例外クラスの元であるExceptionクラスから分かる通り、例外クラスはerror_message属性をもちます。

カスタム例外の場合も同様ですので、以下のようにカスタム例外を定義しただけで、第一引数はエラーメッセージとして利用されます。

example.rb

# カスタム例外の定義
class CustomizedError < StandardError; end

# カスタム例外の利用
raise CustomizedError.new('エラー発生')

実行結果

$ ruby example.rb
# Traceback (most recent call last):
# example.rb:3:in `<main>': エラー発生 (CustomizedError)

エラーメッセージをカスタマイズする場合はinitializeメソッドでsuperを実行する

カスタム例外クラスのinitializeメソッド内でsuperを実行、つまり親クラスのinitializeを呼び出すことでエラーメッセージをカスタマイズできます。

example.rb

# カスタム例外の定義
class CustomizedError < StandardError
  def initialize(response)
    super("エラー発生 - code: #{response[:code]}, message: #{response[:body]}")
  end
end

# カスタム例外の利用
response = { code: '00', body: 'unknown error'}
raise CustomizedError.new(response)

実行結果

$ ruby example.rb
# Traceback (most recent call last):
# example.rb:10:in `<main>': エラー発生 - code: 00, message: unknown error (CustomizedError)

インスタンス変数を利用する場合はinitializeメソッドで定義する

カスタム例外クラスもほかのクラスと同様にインスタンス変数を定義できます。

example.rb

# カスタム例外の定義
class CustomizedError < StandardError
  attr_reader :message

  def initialize(response)
    @message = "code: #{response[:code]}, message: #{response[:body]}"
  end
end

# カスタム例外の利用
begin
  response = { code: '00', body: 'unknown error'}
  raise CustomizedError.new(response)
rescue CustomizedError => e
  p "エラー発生 - #{e.message}"
end

実行結果

$ ruby example.rb
# "エラー発生 - code: 00, message: unknown error"

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考資料