From: Mark Volkmann Date: 2006-02-07T21:10:42+09:00 Subject: Re: reasons to use else inside rescue On 2/7/06, Robert Klemme wrote:> David Vallner wrote:> > D�a Utorok 07 Febru�r 2006 03:33 Mark Volkmann nap�sal:> >> I understand that the code in the else part of a begin block is only> >> executed if no exceptions are raised by code in the begin block.> >> However, the same is true of code at the end of the begin block. Why> >> not put the code there?> >>> >> For example, I believe these are equivalent.> >>> >> begin> >> do_something> >> rescue> >> handle_exception> >> else> >> do_more_stuff> >> end> >>> >> begin> >> do_something> >> do_more_stuff> >> rescue> >> handle_exception> >> end> >>> >> I suppose a difference is that if "do_more_stuff" raises an> >> exception, the first example can't rescue it and the second might.> >> Is that the only difference?> >>> >> --> >> R. Mark Volkmann> >> Partner, Object Computing, Inc.> >> > There's an else part in a begin / end block?! Oh dear. Heavens> > protect us...>> Why?>> > It seems pretty equivalent to plain old:> >> > begin> > do_something> > rescue> > handle_exception> > end> > do_more_stuff> >> > Do we have a syntax guru to elaborate on this?>> Although not being a syntax guru, the idiom you presented is definitely> *not* equivalent. do_more_stuff will also be called if an exception was> caught and not reraised while code in the "else" branch is only invoked if> there was no exception raised.>> > That said, my wild guess would be that in the code fragment> > (apologies for using different method names):> >> > begin> > foo> > rescue> > bar> > else> > baz> > finally>> "finally" is Java - you probably meant "ensure".>> > quux> > end> >> > (*sic* - messiest code excerpt ever)> >> > if #foo didn't raise an Exception, the order of executions would be> > #foo, #baz, and then #quux. That is, unless the else is nothing more> > than no-op syntactic sugar for just putting the statements after a> > begin / rescue / finally block.>> As Mark said, a *rough* equivalent is to put code in the else part> directly before the first rescue. But they do not have the same> semantics! The difference is that all exceptions raised between "begin"> and "rescue" are potentially subject to exception handling on one of the> "rescue" branches. This is not true for code in the "else" branch.>> Another reason to put code into the else branch is documentation. It's> visibly clear that this code does not belong to the main functionality of> the begin end block but that it's intended to act on successfull execution> of the block. Thanks! All this makes sense now. Even though there is some value to it, I suspect that "else" inside a"begin" is rarely used. By "rarely", I mean less that once per hundred"begin" blocks. I suspect this is because it's not a well knownfeature and ends up making the code a bit harder to understand. Ithink I'd typically tend to put the "else" code inside the "begin"block. Does anyone disagree with this? --R. Mark VolkmannPartner, Object Computing, Inc.