# Help begin/rescue/ensure

**URL:** <https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006>\
**Category:** Ruby\
**Created:** [February 9, 2007, 6:20am UTC](https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006 "2007-02-09T06:20:54Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![S\_Kanakakorn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8e8cbc/32.png) [@S\_Kanakakorn](https://www.ruby-forum.com/u/S_Kanakakorn)\
**Post date:** [February 9, 2007, 6:20am UTC](https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006/1 "2007-02-09T06:20:54Z")

</div>

I have this simple code.

require ‘rubygems’  
require ‘net/ssh’

begin  
session = Net::SSH.start(‘aaaa-lnx’, :password=\>‘xyz’,  
:username=\>‘root’,:timeout=\>5)  
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 ?

Thanks,  
-Nick

---

<div class="post-metadata">

**Author:** ![S\_Kanakakorn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8e8cbc/32.png) [@S\_Kanakakorn](https://www.ruby-forum.com/u/S_Kanakakorn)\
**Post date:** [February 9, 2007, 10:21am UTC](https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006/2 "2007-02-09T10:21:14Z")

</div>

On Feb 9, 12:20 am, “S Kanakakorn” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I have this simple code.

…

> “puts ‘at last’” won’t print out.  
> 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

---

<div class="post-metadata">

**Author:** ![S\_Kanakakorn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8e8cbc/32.png) [@S\_Kanakakorn](https://www.ruby-forum.com/u/S_Kanakakorn)\
**Post date:** [February 9, 2007, 10:08am UTC](https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006/3 "2007-02-09T10:08:11Z")

</div>

On Fri, Feb 09, 2007 at 02:20:30PM +0900, S Kanakakorn wrote:

> end  
> puts ‘at last’  
> …  
> What did I do wrong ?

A bare “rescue” doesn’t catch all exceptions, only those which are  
subclasses of StandardError. Change to:

rescue Exception

HTH,

Brian.

---

<div class="post-metadata">

**Author:** ![S\_Kanakakorn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8e8cbc/32.png) [@S\_Kanakakorn](https://www.ruby-forum.com/u/S_Kanakakorn)\
**Post date:** [February 9, 2007, 10:15pm UTC](https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006/4 "2007-02-09T22:15:42Z")

</div>

On Sat, Feb 10, 2007 at 01:45:54AM +0900, Daniel B. wrote:

> > A bare “rescue” doesn’t catch all exceptions, only those which are  
> > subclasses of StandardError. Change to:
> > 
> > rescue Exception
> 
> Given how often this issue appears on the mailing list, I’m beginning  
> to think that a bare rescue should just rescue Exception. That seems  
> to be what most people expect it to do.
> 
> Is there a downside to this idea?

Well, it would be very confusing if a rescue intended to catch an  
invalid-data sort of error also caught an invalid program error (such as  
a  
“method missing” exception caused by a typo in a method name). At best,  
these would end up finding their way into a log somewhere. At worst,  
they  
would be silently ignored, making debugging very difficult.

---

<div class="post-metadata">

**Author:** ![S\_Kanakakorn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/8e8cbc/32.png) [@S\_Kanakakorn](https://www.ruby-forum.com/u/S_Kanakakorn)\
**Post date:** [February 9, 2007, 5:47pm UTC](https://www.ruby-forum.com/t/help-begin-rescue-ensure/85006/5 "2007-02-09T17:47:01Z")

</div>

On Feb 9, 2:06 am, Brian C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > puts ‘reach ensure point’  
> > end  
> > puts ‘at last’  
> > …  
> > What did I do wrong ?
> 
> A bare “rescue” doesn’t catch all exceptions, only those which are  
> subclasses of StandardError. Change to:
> 
> rescue Exception

Given how often this issue appears on the mailing list, I’m beginning  
to think that a bare rescue should just rescue Exception. That seems  
to be what most people expect it to do.

Is there a downside to this idea?

Dan
