2012-08-23 32 views
3

我遇到問題,使EventMachine::DeferrableChildProcess.open實際上做任何形式的錯誤處理。希望我做錯了。這裏有一個例子:EventMachine DeferrableChildProcess錯誤處理

require "eventmachine" 
EM.run do 
    cp = EM::DeferrableChildProcess.open("ls /trololo") 
    cp.callback { |data| puts "Received some data: '#{data}'" } 
    cp.errback { |err| puts "Failed: #{err.inspect}" } 
end 

我希望這段代碼的結果(假設你實際上並沒有在系統上/trolol目錄)是:「失敗:< SomeErrorObject>」。相反,我得到「收到一些數據:''」。如果加上傷害,由ls(「ls:不能訪問/ trololo:沒有這樣的文件或目錄」)引起的錯誤信息以某種方式打印到stderr。

我做錯了什麼,或者是基本沒有錯誤處理EM::DeferrableChildProcess.open?我收到了與EM.popen類似的結果。

回答

3

好的,看着EventMachine的實現,我可以清楚地看到,DeferrableChildProcess只是假設成功 - errback永遠不會被調用。我想這意味着你在自己的回調中必須做get_status來弄清楚發生了什麼事情。我不在乎那個API,所以我寫了一個錯誤處理:DeferrableChildProcess

class DeferrableChildProcess < EventMachine::Connection 
    include EventMachine::Deferrable 

    def initialize 
    super 
    @data = [] 
    end 

    def self.open cmd 
    EventMachine.popen(cmd, DeferrableChildProcess) 
    end 

    def receive_data data 
    @data << data 
    end 

    def unbind 
    status = get_status 
    if status.exitstatus != 0 
     fail(status) 
    else 
     succeed(@data.join, status) 
    end 
    end 
end