3

我希望我的异常类之一能够获取在其上下文中引发异常的对象。例如,在半伪代码中

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 回答
1

http://docs.honeybadger.io/ruby/exceptions/extending-ruby-exceptions.html中的代码是你能得到的最好的:

require 'binding_of_caller'

module RaiseWithObject
  attr_accessor :exc_obj

  def raise *args
    args.first.exc_obj = self if args.first
    super
  end
end

class Object
  include RaiseWithObject
end

它适用于大多数异常,但不适用于 MRI 内部提出的内部异常。

于 2017-06-18T00:39:51.380 回答