2009-04-16 9 views
1

Ruby Exceptionsに含まれているメッセージと、エバール内から発生したメッセージとの間には、奇妙な相違があるようです。たとえば、次のコード:Ruby:エバール内で発生した例外の不要なコンテキスト

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番目にコンテキストなしで例外を発生させることができますどのような方法があります場合?

答えて

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! 

単純なスクリプトよりも大きなものでは、あなた自身のエラータイプを定義することは、とにかく良い方法です。

(クリスは彼の答えに言ったことに合わせてコードを修正するために更新)

2

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

スーパークラスも同様に初期化されているように私は、若干の変更を加えました:

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

(String.newコールが再び以前の動作を避けるために必要としているようだ。おそらくException.newメッセージをインプレースで変更します)。

+0

良い点すべて。 –

関連する問題