From: ChrisH Date: 2007-02-09T18:20:07+09:00 Subject: Re: Help begin/rescue/ensure On Feb 9, 12:20 am, "S Kanakakorn" 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