絮怨潟障

Windows 8.1 Enterprise
> ver
Microsoft Windows [Version 6.3.9600]
> ruby version
Ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-ming32]

の環境で、

自作のスクリプトが、
Failed to open TCP connection to 192.168.0.115:35803 (No connection 
could be made because the target machine actively refused it. - connect(
2) for "192.168.0.115" port 35803)
と、net/http.rb 内 connect method 内 raise により、スクリプトが止まるの
で、

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:882: `No connection could be 
made because the target machine actively refused it. - connect(2) for "
192.168.0.115" port 35803' (Errno::ECONNREFUSED)
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:319:in `open_http'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_
open'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:212:in `block in 
open_loop'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:210:in `catch'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:717:in `open'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:35:in `open'
        from c:/yama/bin/UPnP/EasyUpnpWrap.rb:24:in `fetch_device_name'
        from c:/yama/bin/UPnP/EasyUpnpWrap.rb:15:in `device_name'
        from ./au_easy_upnp.rb:71:in `block in <main>'
        from ./au_easy_upnp.rb:70:in `each'
        from ./au_easy_upnp.rb:70:in `<main>'
C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:882:          raise e, "Failed 
to open TCP connection to " +

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb の 882行目辺りの raise している
箇所を、下記の様に直接編集

    def connect
    …
=begin # original begin
          raise e, "Failed to open TCP connection to " +
            "#{conn_address}:#{conn_port} (#{e.message})"
=end   # original end
       # modified begin
          puts "Failed to open TCP connection to " +
               "#{conn_address}:#{conn_port} (#{e.message})"
          return nil # 何も考えず nil で返しました。
       # modified end
     …

再度スクリプト実行すると、

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:1476: `undefined method `closed?
' for nil:NilClass
Did you mean?  clone' (NoMethodError)
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_
open'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:212:in `block in 
open_loop'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:210:in `catch'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:717:in `open'
        from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:35:in `open'
        from c:/yama/bin/UPnP/EasyUpnpWrap.rb:24:in `fetch_device_name'
        from c:/yama/bin/UPnP/EasyUpnpWrap.rb:15:in `device_name'
        from ./au_easy_upnp.rb:71:in `block in <main>'
        from ./au_easy_upnp.rb:70:in `each'
        from ./au_easy_upnp.rb:70:in `<main>'
C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:1476:      raise exception

と、またraise によりスクリプトが停止するので、下記の様に

def transport_request(req)
…
   rescue => exception
      D "Conn close because of error #{exception}"
      @socket.close if @socket and not @socket.closed?
=begin # original
     raise exception
=end
    end

直接編集で、とりあえず回避できるようになったので、上の暫定変更を元に戻し、

httpWrap.rb を下記の様に作成
C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb で定義されている module Net を
再オープン
エラー部分を含むmethodをそのままコピー
エラー部分を変更
スクリプトより、require_relative ‘httpWrap’
にて、スクリプトが raise で停止してしまうのを回避しました。

もっとスマートな対応方法等ありますでしょうか?
 
# cat httpWrap.rb
module Net
    …
    def connect
      …
      s = Timeout.timeout(@open_timeout, Net::OpenTimeout) {
        begin
          TCPSocket.open(conn_address, conn_port, @local_host, @local_
port)
        rescue => e
=begin # original
          raise e, "Failed to open TCP connection to " +
            "#{conn_address}:#{conn_port} (#{e.message})"
=end
# modified start
          puts "Failed to open TCP connection to " +
               "#{conn_address}:#{conn_port} (#{e.message})"
          return nil
# modified end
        end
      }
    …
    private :connect

    def transport_request(req)
    …
    rescue => exception
      D "Conn close because of error #{exception}"
      @socket.close if @socket and not @socket.closed?
#     raise exception # original code
    end
    …
end