救援EventMachine :: Deferrable中的错误

时间:2013-03-15 19:16:18

标签: ruby eventmachine

我试图找出如何使EventMachine::Deferrable回调不引发任何异常。我没有在每个回调块中使用begin ... rescue,而是尝试使用方法调用以某种方式包装块,以便该方法挽救异常:

require 'eventmachine'

def to_proc
  proc
rescue Exception => e
  puts "e=#{e}"
end

EventMachine::run {
  d = EventMachine::DefaultDeferrable.new
  f =  to_proc {raise 'error'}

  d.callback &f

  EventMachine.next_tick {d.succeed}
}

这当然不起作用。我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:0)

在语句d.callback &f处,调用to_proc。您尝试在d.succeed处捕获的异常无法捕获,因为我们已经超出了您的异常处理的上下文。

我真的不确定你想要捕捉到什么错误。如果您在EventMachine所做的事情中出现错误,您可以创建一个#errBack来捕获它们。如果你真的试图捕获只发生在回调中的异常,那么你应该在回调中编写异常处理程序(对于你期望的特定异常!)。

但是,如果你真的想捕获所有过程中的所有错误,则需要在类Proc中覆盖调用:

# Note this code hasn't been tested and is only provided as an example
class Proc
  alias_method :old_call, :call
  def call(*args)
    begin
      old_call(*args)
    rescue Exception => e
      # Handle exception
    end
  end
end

我不推荐这种方法