Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 异常类如何获取引发它的对象?_Ruby_Exception_Binding - Fatal编程技术网

Ruby 异常类如何获取引发它的对象?

Ruby 异常类如何获取引发它的对象?,ruby,exception,binding,Ruby,Exception,Binding,我希望我的一个异常类能够获取在其上下文中引发异常的对象。例如,在半伪码中 class Foo def zorch! raise MyException.new("d'oh!") end end c = Foo.new c.zorch! 我希望MyException\initialize能够获得对象c 这可能可以通过使用#initialize方法中的self.send(:binding)以某种方式完成,但我还不知道如何: Kernel.eval('self', self.sen

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

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

c = Foo.new
c.zorch!
我希望
MyException\initialize
能够获得对象
c

这可能可以通过使用
#initialize
方法中的
self.send(:binding)
以某种方式完成,但我还不知道如何:

Kernel.eval('self', self.send(:binding)).class.name
=> MyException   # *not* 'Foo'
这是有道理的,因为MyException还没有完全实例化,而且
self.send(:binding)
引用的是当前上下文,而不是调用方的上下文

那么如何访问调用方的上下文/绑定呢?

类MyExceptionclass 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>
属性读取器:obj def初始化obj,*参数;超级(*args)@obj=obj结束 结束 福班 戴夫·佐尔奇! 提出我的异议。新的(自我,“噢!”) 结束 结束 c=Foo.new 开始 c、 佐尔奇! 救援=>e 把e.obj 结束 # => # 来自的代码是您可以获得的最佳代码:

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中提出的内部异常。

不幸的是,我需要避免为此使用特殊的调用序列,因此更改序列以包含对调用方的引用是行不通的。不过,谢谢。关于库和ruby本身引发的异常呢?你找到更好的解决方案了吗?只是好奇,你为什么需要它?我想知道,这样我就可以将异常对象中的信息添加到我要生成的报告中——但我现在完全忘了。我怀念Digital的VMS功能丰富的异常处理。。