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