gpt4 book ai didi

ruby - 在条件不佳的情况下使用异常在执行过程中停止 IO.popen

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:02 25 4
gpt4 key购买 nike

在我的 Ruby 脚本中,我调用了一个 Perl 脚本并等待它完成执行。然而,有时 Perl 脚本会遇到一系列错误,我希望 Ruby 能够自动处理这些错误。所以,我实现了以下...

begin
IO.popen(cmdLineExecution) do |stream|
stream.each do |line|
puts line
if line =~ /Some line that I know is an error/
raise MyOwnException
end
end
end

begin
#Wait on the child process
Process.waitpid
rescue Errno::ECHILD
end
rescue MyOwnException
#Abort the command mid processing, and handle the error
end

但是,即使抛出异常,Perl 脚本仍会继续执行,只是它不再将输出通过管道传输到 STDOUT。此时,如果我想停止 Perl 进程,我必须进入任务管理器并手动停止它。然后 Process.waitpid 结束并从那里继续。要么是那样,要么是我停止了 Ruby,而 Perl 进程继续在后台运行,我仍然必须手动停止它。

顺便说一句:这是在 Windows 上

因此问题是如何在 Perl 进程不成为进程中间的孤立进程的情况下停止 IO.popen?

最佳答案

所以 - 免责声明,我在 Windows 上使用 Ruby 1.8.6。它是我目前使用的软件唯一支持的Ruby,所以可能会有更优雅的解决方案。总的来说,它归结为确保进程在继续执行之前使用 Process.kill 命令终止。

IO.popen(cmdLineExecution) do |stream|
stream.each do |line|
puts line
begin
#if it finds an error, throws an exception
analyzeLine(line)
rescue correctionException
#if it was able to handle the error
puts "Handled the exception successfully"
Process.kill("KILL", stream.pid) #stop the system process
rescue correctionFailedException => failedEx
#not able to handle the error
puts "Failed handling the exception"
Process.kill("KILL", stream.pid) #stop the system process
raise "Was unable to make a known correction to the running enviorment: #{failedEx.message}"
end
end
end

我将两个异常都设为继承 Exception 的标准类。

关于ruby - 在条件不佳的情况下使用异常在执行过程中停止 IO.popen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744853/

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