ruby - 异常类如何获得引发它的对象?

标签 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.send(:binding)).class.name
=> MyException   # *not* 'Foo'

这是有道理的,因为 MyException 尚未完全实例化并且 self.send(:binding) 指的是当前上下文而不是调用者的上下文。

那么我怎样才能访问调用者的上下文/绑定(bind)呢?

最佳答案

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>

关于ruby - 异常类如何获得引发它的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18544546/

相关文章:

ruby - 如何更轻松地运行此脚本

wpf - 如何将 View 绑定(bind)到使用参数实例化的 View 模型?

mysql - 如何在 Mac OS X 10.6.6 上安装 mysql 和 ruby​​ 以及 mysql/ruby

ruby - 如何在 Ruby 中将自定义类隐式转换为整数?

Java 小程序 AWT-EventQueue-1 异常

objective-c - 以编程方式调用 segue 原因 NSInvalidArgumentException,原因 : 'UILabel length' unrecognized selector

javascript - AngularJS 绑定(bind)问题

wpf - 使用 Caliburn Micro 约定将 ViewModel 本身绑定(bind)到 DataTemplate 内

ruby : Split string on boundaries

c# - try catch 异常