Chris Hulan
2/9/2007 9:17:00 AM
On Feb 9, 12:20 am, "S Kanakakorn" <configt...@gmail.com> wrote:
> I have this simple code.
>
...
> rescue
> puts 'cannot connect '
> ensure
> puts 'reach ensure point'
> end
> puts 'at last'
>
> --------------------------------------
>
> If I put in non existing host name (aaaa-lnx), then the statement
> "puts 'at last'" won't print out.
> The ensure blocks work fine. Somehow, the "rescue" block can't catch
> the error. This is my output.
>
> reach ensure point
> /Applications/Locomotive2/Bundles/standardRailsJan2007.locobundle/i386/lib/ruby/1.8/timeout.rb:54:in
> `open': execution expired (Timeout::Error)
> from /Applications/Locomotive2/Bundles/standardRailsJan2007.locobundle/i386/lib/ruby/gems/1.8/gems/net-ssh-1.0.10/lib/net/ssh/transport/session.rb:88:in
> `initialize'
>
> If I put in a good hostname with wrong password, the "rescue" block
> will catch the error just fine. Here is the output:
>
> cannot connect
> reach ensure point
> at last
>
> What did I do wrong ?
rescue without a specified exception defaults to StandardError.
Tiimeout::Error is a subclass of SignalException, which is a sibling
of StandardError, not a subclass. Thus that exception doesn't match
your rescue, so the exception gets passed up the call stack, the
ensure
gets executed, but the code after it is bypassed.
For a picture of the exception class hierarchy see http://
www.insula.cz/dali/material/rubycl/RubyExceptionClasses.jpg
cheers
Chris