3

我在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目录)是:“失败:<SomeErrorObject>”。相反,我得到“收到一些数据:''”。ls雪上加霜的是,由("ls: cannot access /trololo: No such file or directory")引起的错误消息以某种方式打印到 stderr。

我做错了什么,还是基本上没有错误处理EM::DeferrableChildProcess.open?我得到了类似的结果EM.popen

4

1 回答 1

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
于 2012-08-23T13:25:42.567 回答