我在使 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
目录)是:“失败:ls
引起的错误消息(“ls:无法访问/trololo:没有这样的文件或目录”)以某种方式打印到 stderr。
是我做错了什么,还是 EM::DeferrableChildProcess.open
中基本上没有错误处理?我用 EM.popen
得到了类似的结果。
最佳答案
好的,看看 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
关于ruby - EventMachine DeferrableChildProcess 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090635/