目次
カスタム例外を作成する際は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)やってます。フォローしてもらえるとうれしいです!