3

例外クラスの 1 つが、例外が発生したコンテキストのオブジェクトを取得できるようにしたいと考えています。たとえば、半疑似コードでは

class Foo
  def zorch!
    raise MyException.new("d'oh!")
  end
end

c = Foo.new
c.zorch!

MyException#initializeオブジェクトを取得できるようにしたいc

これはおそらくメソッドを使用self.send(:binding)して何らかの方法で実行できます#initializeが、まだ方法がわかりません:

Kernel.eval('self', self.send(:binding)).class.name
=> MyException   # *not* 'Foo'

MyException はまだ完全にインスタンス化されておらずself.send(:binding)、呼び出し元ではなく現在のコンテキストを参照しているため、これは理にかなっています。

では、呼び出し元のコンテキスト/バインディングにアクセスするにはどうすればよいでしょうか?

4

2 に答える 2

2
class MyException < StandardError
  attr_reader :obj
  def initialize obj, *args; super(*args); @obj = obj end
end

class Foo
  def zorch!
    raise MyException.new(self, "d'oh!")
  end
end

c = Foo.new
begin
  c.zorch!
rescue => e
  puts e.obj
end
# => #<Foo:0x007fdd4a474da0>
于 2013-08-31T04:56:21.837 に答える