gpt4 book ai didi

ruby - EventMachine DeferrableChildProcess 错误处理

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:03 27 4
gpt4 key购买 nike

我在使 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com