Exceptions : should I else or not?

Hello, when writing stuff like that

begin
call_this()
do_that()
tell_them()
print “Ho yes #{my_dear} you did it”
rescue SomeException => e

snip

end

Should I move the print statement to the else part of begin/end catch
block ?

begin
call_this()
do_that()
tell_them()
rescue SomeException => e

snip

else
print “Ho yes #{my_dear} you did it”
end

I presume that the result is the same, but for clarity I would prefer
the second solution - Now, what happen if the print statement fails or
if my_dear() raises something ? I’ll not catch it losing the benefit of
the begin/end. So, even if easier to read, is else really useful/a good
idea ?

Paganoni wrote:

print “Ho yes #{my_dear} you did it”
end

I presume that the result is the same, but for clarity I would prefer
the second solution - Now, what happen if the print statement fails or
if my_dear() raises something ? I’ll not catch it losing the benefit of
the begin/end. So, even if easier to read, is else really useful/a good
idea ?

The second way gives you more control over where exceptions are caught,
and therefore more precise knowledge of the source of the exception. As
you point out, the print statement might raise something. If that
happens above the rescue clause, then you don’t necessarily know what
the source of the exception was. This is particularly important for
common errors like NoMethodError, which can be caused by typos as well
as by situations that are expected by the program.

On Tue, Apr 7, 2009 at 12:34 PM, Paganoni [email protected]
wrote:

 print “Ho yes #{my_dear} you did it”
end

I presume that the result is the same, but for clarity I would prefer the
second solution - Now, what happen if the print statement fails or if
my_dear() raises something ? I’ll not catch it losing the benefit of the
begin/end. So, even if easier to read, is else really useful/a good idea ?

Yes, often, because you should (in general) only be rescuing
exceptions if you can do something useful with them where you are,
otherwise, you should be letting them bubble up. So if the errors you
are going to deal with aren’t the one’s in the print line, it makes
sense to have it in the else. Of course, if you different logic to
deal with errors in the print statement, it even make make sense to
do:

begin
.
.
.
rescue SomeException => e
.
.
.
else
begin
print “Ho yes #{my_dear} you did it”
rescue SomeException => e
.
.
.
end
end

On Tue, Apr 7, 2009 at 9:34 PM, Paganoni [email protected] wrote:

Hello, when writing stuff like that
Hmm I am speaking up againts very learned folks, so I might be wrong (
but that is true anyway ;).

Now I think that

begin
do_stuff
other_stuff
except
whatever
end

is easier to read than

begin
do_stuff
except
whatever
else
other_stuff
end

This however does not invalidate the very sound reasons Joel et altri
have given to move some code into the else clause.
What to do then? Maybe it all depends on the context (thank you Andy;)?
If you are catching a very general exception e.g.
except
except StandardError
except Exception
it is probably indeed wise to chose the else for your “ordinary” code.

However if do_stuff might raise a very specific exception I would
prefer the “simpler”

begin
do_stuff
other_stuff
except SpecificException => se
whatever se
end

Just my micromoney.
Cheers
Robert

There are some people who begin the Zoo at the beginning, called
WAYIN, and walk as quickly as they can past every cage until they get
to the one called WAYOUT, but the nicest people go straight to the
animal they love the most, and stay there. ~ A.A. Milne (from
Winnie-the-Pooh)