[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Exceptions : should I else or not ?

Paganoni

4/7/2009 7:31:00 PM

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 ?


3 Answers

Joel VanderWerf

4/7/2009 8:13:00 PM

0

Paganoni wrote:
> 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.

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Christopher Dicely

4/8/2009 12:55:00 AM

0

On Tue, Apr 7, 2009 at 12:34 PM, Paganoni <noway@fakenullvoid.com> wrote:
> 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
.
.
.
rescue SomeException =3D> e
.
.
.
else
begin
print "Ho yes #{my_dear} you did it"
rescue SomeException =3D> e
.
.
.
end
end

Robert Dober

4/8/2009 8:56:00 AM

0

On Tue, Apr 7, 2009 at 9:34 PM, Paganoni <noway@fakenullvoid.com> 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)