雖然信號陷阱做工作,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