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功能丰富的异常处理。。