我试图找出如何使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}
}
这当然不起作用。我将不胜感激任何帮助。
答案 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
我不推荐这种方法