From: Robert Klemme Date: 2006-02-07T18:13:21+09:00 Subject: Re: reasons to use else inside rescue 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. Kind regards robert