98

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

私が知っていること

カスタム エラー クラスを宣言してから継承させることStandardErrorができるので、rescuedにすることができます。

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

それは機能しますか?もしそうなら、これは物事を行う正しい方法ですか?

4

4 に答える 4

127

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

Ruby で `rescue Exception => e`にするのはなぜ悪いスタイルなのかを参照rescue Exceptionしてください。.rescue MyCustomError

于 2013-04-19T15:31:10.227 に答える
6

あなたの考えは正しいですが、あなたの呼び方は間違っています。そのはず

raise MyCustomError.new(an_object, "A message")
于 2013-04-19T14:20:04.663 に答える
5

私は似たようなことをしたかった。オブジェクトを #new に渡し、渡されたオブジェクトの処理に基づいてメッセージを設定したいと考えていました。以下の作品。

class FooError < StandardError
  attr_accessor :message # this is critical!
  def initialize(stuff)
    @message = stuff.reverse
  end
end

begin
  raise FooError.new("!dlroW olleH")
rescue FooError => e
  puts e.message #=> Hello World!
end

宣言しないと動作しないので注意してくださいattr_accessor :message。OPの問題に対処するために、メッセージを追加の引数として渡し、好きなものを保存することもできます。重要な部分は #message をオーバーライドしているようです。

于 2016-02-09T19:16:57.707 に答える