虽然信号陷阱做工作,tokland说,他们定义的应用广泛,可能会导致一些意外的行为,如果你想在一些其他的方式来处理一个破裂的管道在你的应用程序的其他地方。
我建议只使用标准救援,因为错误仍然继承自StandardError。更多关于此模块的错误:http://ruby-doc.org/core-2.0.0/Errno.html
例子:
begin
vari.print("x=" + my_val + "&y=1&z=Add+Num\r\n")
rescue Errno::EPIPE
puts "Connection broke!"
end
编辑:要注意这一点很重要(如@ mklement0在评论中一样),如果你最初管道使用看跌期权的东西你的输出期望在STDOUT上输出,最后放入上面的代码将引发另一个Errno :: EPIPE异常。无论如何,使用STDERR.puts可能是更好的做法。
begin
vari.print("x=" + my_val + "&y=1&z=Add+Num\r\n")
rescue Errno::EPIPE
STDERR.puts "Connection broke!"
end
实际上,这段代码都是针对http请求的。这是否意味着服务器在那时没有连接?这似乎是随机发生的。 – sepiroth 2009-11-27 08:23:57
我对ruby不太了解,但EPIPE可能会造成网络断开。在Linux上,我预计这种情况下的错误可能是ENETRESET,ECONNABORTED,ECONNRESET,ENOTCONN或ESHUTDOWN。 – wallyk 2009-11-27 09:01:17
@sepiroth:'EPIPE'是_system_-defined;它是系统调用报告的退出代码,它触发了'SIGPIPE'信号,这通常表明_pipe_的_reading_端处的进程已退出(而_writing_端仍在尝试写入管道);另外,在_network_上下文中, [this](https://www.gnu.org/software/libc/manual/html_mono/libc.html#Operation-Error-Signals)指出:“SIGPIPE的另一个原因是当您尝试输出到未连接的_socket_时,请参阅[发送数据](https://www.gnu.org/software/libc/manual/html_mono/libc.html#Sending-Data)“。 – mklement0 2015-05-07 13:09:41