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)、"Failed: <SomeErrorObject>" になると思います。代わりに、「一部のデータを受信しました: ''」が表示されます。さらにひどいことに、("ls: cannot access /trololo: No such file or directory")によって引き起こされたエラー メッセージlsが何らかの形で stderr に出力されます。

私は何か間違ったことをしていますか、それとも基本的にエラー処理はありませEM::DeferrableChildProcess.openんか? と同様の結果が得られましEM.popenた。

4

1 に答える 1

3

OK、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 に答える