示例很简单,我需要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
块。这样,每当线程失败时,我都不需要挠头。
谢谢。
答案 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