Exceptions : should I else or not ?

P

Paganoni

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 ?
 
J

Joel VanderWerf

Paganoni said:
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 ?

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.
 
C

Christopher Dicely

Hello, when writing stuff like that

begin
=C2=A0call_this()
=C2=A0do_that()
=C2=A0tell_them()
=C2=A0print "Ho yes #{my_dear} you did it"
rescue SomeException =3D> e
=C2=A0# snip
end

Should I move the print statement to the else part of begin/end catch blo= ck
?

begin
=C2=A0call_this()
=C2=A0do_that()
=C2=A0tell_them()
rescue SomeException =3D> e
=C2=A0# snip
else
=C2=A0print "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
 
R

Robert Dober

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)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,772
Messages
2,569,593
Members
45,112
Latest member
VinayKumar Nevatia
Top