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:
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.
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.
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.
···
On Sat, Feb 10, 2007 at 01:45:54AM +0900, Daniel Berger 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.