1. ホーム
  2. ruby

[解決済み] Rubyのカスタムエランクラス:message属性の継承

2023-01-13 17:38:47

質問

カスタム例外クラスに関する情報があまり見つからないようです。

私が知っていること

独自のエラークラスを宣言し、それを StandardError を継承させることで rescue d:

class MyCustomError < StandardError
end

を使って上げることができます。

raise MyCustomError, "A message"

というメッセージが表示され、その後、救出する際に

rescue MyCustomError => e
  puts e.message # => "A message"

わからないこと

例外にカスタムフィールドを持たせたいのですが、そのためには message 属性を継承したいのです。を読んでわかったのですが を読むと、このトピックでは というのは @message は例外クラスのインスタンス変数ではないので、継承がうまくいくか心配です。

どなたか、この件に関する詳細を教えてください。どのようにカスタムエロークラスを object 属性でどのように実装するのでしょうか?以下は正しいですか。

class MyCustomError < StandardError
  attr_reader :object
  def initialize(message, object)
    super(message)
    @object = object
  end
end

そして

raise MyCustomError.new(anObject), "A message"

を取得する。

rescue MyCustomError => e
  puts e.message # => "A message"
  puts e.object # => anObject

はうまくいくのでしょうか、また、うまくいくとして、このやり方は正しいのでしょうか?

どのように解決するのですか?

raise はすでにメッセージを設定しているので、コンストラクタにメッセージを渡す必要はありません。

class MyCustomError < StandardError
  attr_reader :object

  def initialize(object)
    @object = object
  end
end

begin
  raise MyCustomError.new("an object"), "a message"
rescue MyCustomError => e
  puts e.message # => "a message"
  puts e.object # => "an object"
end

を置き換えた rescue Exceptionrescue MyCustomError を使用する場合、以下を参照してください。 Rubyで `rescue Exception => e` とするのはなぜ悪いスタイルなのですか? .