[Python-Dev] PEP 344: Implicit Chaining Semantics

Ka-Ping Yee python-dev at zesty.ca
Fri May 20 10:30:17 CEST 2005

Guido van Rossum wrote:
>     try:
>         BLOCK
>     except EXCEPTION, VAR:
>         HANDLER
> I'd like to see this translated into
>     try:
>         BLOCK
>     except EXCEPTION, VAR:
>         __context = VAR
>         try:
>             HANDLER
>         except Exception, __error:
>             __error.__context__ = __context
>             raise

Eric Nieuwland wrote:
> If I interpret the above translation correctly, then:
>      try:
>          BLOCK1
>      except EXCEPTION1, VAR1:
>          try:
>              BLOCK2
>          except EXCEPTION2, VAR2:
>              HANDLER
> with exceptions occuring in BLOCK1, BLOCK2 and HANDLER would result in
> HANDLER's exception with __context__ set to BLOCK1's exception and
> BLOCK2's exception would be lost.

Guido van Rossum wrote:
> But that could easily be fixed by appending the context to the end of
> the chain, right?

That would fix this case, but i have a hard time proving to myself that
the result would include all the tracebacks in chronological order.

Can be back up and see if we can agree on a specification at a semantic
level first?  I've been trying to narrow down exactly what you seem to
intuitively want -- how do you like the following:

   Definition of "context": An exception-raise event X is the context
   for an exception-raise event Y if and only if

   1.  Y occurs after X in the same thread.

   2.  If an 'except' clause catches X, Y occurs before exit from this
       clause and is not caught before exit from this clause.

(I refer to "exception-raise events" to avoid any ambiguity about the
same exception object being raised twice.  Each raise-event corresponds
to at most one catch.)

-- ?!ng

More information about the Python-Dev mailing list