I have modified RFC 88 so that the following =head1 DESCRIPTION throw Exception::IO "a message", tag => "ABC.1234", ... ; now reads like this: =head1 DESCRIPTION The most common forms of structured exception handling are straight- forward. Here they are: try { ... } catch { ... } Invoke the catch block only if the try block raises an exception (aka dies), otherwise, there is nothing to catch. Continue unwinding (propagate $@) only if the catch block was invoked and it raises an exception too. Otherwise, execute the next statement according to local flow-control, because either no exception has been raised by either block, or one was raised in try but it was cleanly caught. try { ... } finally { ... } Invoke the finally block whether or not the try block raises an exception. Continue unwinding (propagate $@) if either the try block or the finally block raised an exception. Otherwise, execute the next statement according to local flow control, because no exception has been raised. try { ... } catch MatchThis => { ... } catch MatchThat => { ... } catch { ... } # everything else finally { ... } In this case if the try raises an exception then the first matching catch is invoked, and then whether or not the try (or any catch) raised any exception, the finally is invoked. Once a catch clause matches, subsequent catch clauses are skipped (like elsif/elsif/else). This try statement continues excecution normally unless (1) try threw and (a) no catch matched or (b) a catch matched and its block threw, or (2) finally threw. Otherwise no-one threw, or it was in a try and it was cleanly caught. This means that all exceptions propagate unless they are cleanly caught, just as in Perl 5. To prevent this, use: try { fragile(); } catch { } # Go on no matter what. try { ... } finally { ... } finally { ... } Do all finallys even if the try block or any finally block raises an exception. Unwind if any block raised an exception. See below. try { ... } catch { ... } finally { ... } catch { ... } Do the last catch if any of the first three blocks raises an exception, unless it was cleanly caught (that is, it was in try and the first catch didn't raise an exception). Unwind if any block raised an exception, unless it was the cleanly caught one. See below. More complicated constructs should be avoided unless the rules in L<Unwinding Semantics> make sense to you and your target audience. =head2 Walkthrough throw Exception::IO "a message", tag => "ABC.1234", ... ; Yours, &c, Tony Olekshy