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:

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

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 12:34 PM, Paganoni <noway@fakenullvoid.com> 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 ?

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)

···

On Tue, Apr 7, 2009 at 9:34 PM, Paganoni <noway@fakenullvoid.com> wrote:

Hello, when writing stuff like that