Ruby EventMachine DeferrableChildProcess错误处理

Ruby EventMachine DeferrableChildProcess错误处理,ruby,eventmachine,child-process,Ruby,Eventmachine,Child Process,我在制作EventMachine::DeferrableChildProcess时遇到问题。open实际执行任何类型的错误处理。希望我做错了。下面是一个例子: require "eventmachine" EM.run do cp = EM::DeferrableChildProcess.open("ls /trololo") cp.callback { |data| puts "Received some data: '#{data}'" } cp.errback { |err|

我在制作
EventMachine::DeferrableChildProcess时遇到问题。open
实际执行任何类型的错误处理。希望我做错了。下面是一个例子:

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
目录)是:“Failed:”。相反,我得到的是“收到一些数据:“”。雪上加霜的是,
ls
(“ls:cannot access/trololo:No-this file或directory”)导致的错误消息以某种方式打印到了stderr


我是做错了什么,还是在
EM::DeferrableChildProcess.open中基本上没有错误处理?我在
EM.popen
中得到了类似的结果。好的,看看EventMachine的实现,我可以清楚地看到
延迟ChildProcess
只是假设成功-永远不会调用
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
class DeferrableChildProcess