Quoting pergesu / gmail.com, on Sat, Apr 02, 2005 at 08:05:15PM +0900:
> I'm writing a little method that just tries to open a tcp socket
> connection, then closes it off.  I'm using timeout to limit the amount
> of time it tries to connect (is there a better way?).  If it times

I have to wonder why you want to override the TCP protocols ideas of a
timeout. The protocol designers and implementors have a pretty good idea
of what  the timeouts should be.  If its not fast enough for you, you
probably want too much.  Doing this will make your code flaky and
unreliable when the network isn't as fast as your local network. A good
text on network programming should explain this. If you are finding your
app is blocked, you can use ruby threads to do connections in the
background.

That said, you can't catch exceptions like that, try:

begin
  Timeout::timeout(3) do
     long running op
  end
rescue Timeout::Error
  p "hi"
end

Sam

> out, I just want to say that the connect failed.  Despite catching the
> Timeout::Error (I think, anyway), I always get the Exception output. 
> First, here's the method:
> 
> 	def execute
> 		status = timeout(@timeoutval) {
> 			socket = TCPSocket.new(@host, @port) rescue false
> 		
> 			socket.close if socket
> 			return socket != false
> 		} rescue Timeout::Error
> 		
> 		return false
> 	end
> 
> And now the output from my unit test:
> 
> Started
> /usr/local/lib/ruby/1.8/timeout.rb:42:in `new': execution expired
> (Timeout::Error)
>         from ./PortHostTest.rb:16:in `execute'
>         from ./PortHostTest.rb:15:in `timeout'
>         from /usr/local/lib/ruby/1.8/timeout.rb:55:in `timeout'
>         from ./PortHostTest.rb:15:in `execute'
>         from ./HostTest.rb:10:in `runTest'
>         from ../tests/test_HostTest.rb:14:in `test_simple'
>         from /usr/local/lib/ruby/1.8/test/unit/testcase.rb:70:in `__send__'
>         from /usr/local/lib/ruby/1.8/test/unit/testcase.rb:70:in `run'
>          ... 10 levels...
>         from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:194:in `run'
>         from /usr/local/lib/ruby/1.8/test/unit/autorunner.rb:14:in `run'
>         from /usr/local/lib/ruby/1.8/test/unit.rb:285
>         from /usr/local/lib/ruby/1.8/test/unit.rb:283
>