Ruby添加行来阻止(Proc)代码

时间:2012-11-28 12:48:31

标签: ruby-on-rails ruby metaprogramming

示例很简单,我需要Ruby 1.8.7

的解决方案

修改 添加了Ramaze调用以更好地解释编辑块的需要。我想要一种方法来更改块,以便我可以包装rescue块并记录线程是否失败。 API link

class Foo
  def self.execute(&block)
    # Remaze will create new thread to execute the block
    # I want to change block so that I can add rescue in case thread fails
    Ramaze::defer(block)
  end
end

用法

Foo.execute do
  puts "Hello!!!"
end
# => Hello!!!

我要做的是向&block添加几行代码,例如最后puts "World!!!但动态。真实世界的实现是我有一个延迟创建线程的类,我想在推迟创建线程之前添加rescue块。这样,每当线程失败时,我都不需要挠头。

谢谢。

1 个答案:

答案 0 :(得分:3)

原来解决方案非常简单,只是没有使用块的经验立即看到它。塞尔吉奥建议的东西。

class Foo
  def self.execute(&block)
    Ramaze::defer(&wrap(&block))
  end

  private

  def self.wrap(&block)
    return lambda do
     begin
      yield
      rescue Exception => e
       Log.error "[ERROR IN THREAD] #{e.message}, #{e.backtrace}"
      end
    end
  end
end