2013-03-15 77 views
1

我想弄清楚如何使EventMachine::Deferrable回調不會引發任何異常。相反,在逢回調塊爲begin ... rescue的,我想用一個方法調用莫名其妙地包住塊,使該方法救例外:救援EventMachine中的錯誤::可推遲

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

在語句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 

我並不推薦這種方法