1

直接発生する Ruby 例外に含まれるメッセージと、eval 内から発生するメッセージとの間に奇妙な不一致があるようです。たとえば、次のコード:

def foo
 raise "Help!"
end

puts "\nRescue foo"
begin
 foo
rescue RuntimeError => e
 puts e.message
end

puts "\nRescue eval 'foo'"
begin
 eval "foo"
rescue RuntimeError => e
 puts e.message
end

次の出力が生成されます。

Rescue foo
Help!

Rescue eval 'foo'
./temp.rb:2:in `foo': Help!

正規表現を使用してそれをサブする以外に、2番目のケースでコンテキストなしで例外を発生させる方法はありますか?

4

2 に答える 2

2

ありがとう。とにかく自分のエラーを定義していたので、簡単に修正できます。

スーパークラスも初期化されるように、少し変更を加えました。

class MyException < RuntimeError
  attr_accessor :my_message
  def initialize(m)
    @my_message = String.new(m)
    super
  end
end

(String.new 呼び出しは、古い動作を再び取得することを避けるために必要なようです。おそらく、Exception.new はメッセージをインプレースで変更します。)

于 2009-04-16T09:44:45.247 に答える
1

それは珍しいことです、私は前にそれに出くわしたことがありません。その情報を追加しないように eval を説得する方法がわかりません。そのため、言及した正規表現の変更を行うか、独自のエラータイプを定義できます。

class MyError < RuntimeError
  attr_accessor :my_message
  def initialize(m)
    @my_message = m.dup
    super
  end
end

def foo
 raise MyError.new("Help!")
end

puts "\nRescue eval 'foo'"
begin
 eval "foo"
rescue RuntimeError => e
 puts e.my_message
end

出力あり:

Rescue eval 'foo'
Help!

とにかく、単純なスクリプトよりも大きなものでは、独自のエラー タイプを定義することをお勧めします。

(クリスが答えで言ったことに合わせてコードを修正するために更新されました)

于 2009-04-16T09:30:20.990 に答える