Hmm. Well, your rescue clause is looking specifically for exceptions of type Timeout::Error or of a subclass of that class. Since Errno::ETIMEDOUT isn't descended from Timeout::Error, the rescue clause never gets called. If you want a generic rescue to catch everything, try 'rescue Exception => e' Bill On Tue, 5 Oct 2004 14:04:53 +0900, Mark Probert <probertm / nospam-acm.org> wrote: > Hi .. > > Bill Atkins <batkins57 / gmail.com> wrote: > > > > Add a rescue clause for the exception you're getting: ... > > Is that what you're looking for? > > > > Not quite. > > I guess the real qustion is why Timeout::Error doesn't trap > Errno::ETIMEDOUT. The socket times out before the timeout() and raises a > different timeout error. Perhaps it would be better if, when a block is > wrapped in a Timeout::timeout, that all subservient timeouts should be > caught by the single rescue. > > It does raise the question why the generic rescue isn't triggered. > > > > Bill Atkins > > > > On Tue, 5 Oct 2004 06:09:53 +0900, Mark Probert > > <probertm / nospam-acm.org> wrote: > >> > >> Hi .. > >> > >> I have the following code: > >> > >> def alive?(host,port) > >> ok = false > >> begin > >> Timeout::timeout(30) { > >> begin > >> t = TCPSocket.new(host,port) # <--- line 150 > >> t.close > >> ok = true > >> rescue Exception => e # why not caught here? > >> @exception = e > >> end > >> } > >> rescue Timeout::Error => e # or here? > >> @exception = e > >> end > >> return ok > >> end > >> > >> In a known failure case, TCPSocket will fail (no host connectivity). > >> > >> However, > >> > >> 13:56 (hobbes)$ ruby foo.rb > >> Exception `Errno::ETIMEDOUT' at ./bsn.rb:150 - Connection timed out - > >> > >> 13:57 (hobbes)$ ruby -v > >> ruby 1.8.1 (2003-12-25) [i386-cygwin] > >> > >> What is the right way of handling this exception? > >> > >> -- > >> -mark. (probertm @ acm dot org) > >> > >> > > > > > > > > > > > -- > -mark. (probertm @ acm dot org) > >