Bill Atkins
10/5/2004 5:20:00 AM
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)
>
>