[Python-Dev] Acquire/release functionality (Was: Extended Function syntax)

holger krekel pyth@devel.trillke.net
Mon, 3 Feb 2003 14:30:36 +0100


Moore, Paul wrote:
> From: holger krekel [mailto:pyth@devel.trillke.net]
> 
> > Bernhard Herzog wrote:
> >
> > > Alex Martelli <aleax@aleax.it> writes:
> > >
> > > > > the exception should be propogated. The problem is that I'm not
> > > > > sure what is the best way for an __except__ method to signal
> > > > > that it caught the exception.
> > > >
> > > > Maybe the return value of __except__ should be evaluated in a
> > > > boolean context encoding this? False -> exception not caught, True
> > > > -> caught ...
> > >
> > > __except__ could just reraise the exception if it doesn't handle it.
> > > This behavior would be similar to that of a normal except clause   .
> >
> > exactly!
> 
> The problem in practice is that this means you have to take explicit action
> to say "I don't know what to do with this". I'd rather it was the other way
> round, with an empty exception handler
> 
>     def __except__(self): pass
> 
> doing nothing (as it looks). If you need to reraise, then this handler
> silently eats all exceptions. Basically, an empty handler should be the
> same as no handler. (If for no other reason than to give a subclass a
> way of disabling the superclass' handler).

With my approach i had all those hooks and __except__ in particular
*optional*.  So if you actually wrote 

    def __except__(self, type, value, traceback):
        ...

then i presume that you want to check something with the exception
(and that's why we should pass it in, btw.).  

It's difficult if you have an exception within __except__
because the interpreter would have to keep nested 'exception'
information.  So delegating the responsibility to __except__ is
the cleanest solution IMO.  All 'execution' hooks should only
handle events (enter/leave/except) but not push something back 
because it really complicates matters.
 
> Actually, it's clear to me that the controversial issues are:
> 
> 1. Multiple expressions in one with clause
> 2. Exception handling
> 
> Maybe the simplest answer is to remove both of these options, and stick
> with a slimmed down version which does gthe basics well. Does anyone have
> a good use case for either of these features?

Meanwhile i made a proposal in a new thread where i have some
use cases.  I am pretty sure that stating exception behaviour up-front
is not YAGNI.  At least for the xml-case there is a *very* nice use 
case (which i use in another project):

    XYZ html.tr():
        XYZ html.td():  compute_column()

now the html.td() handler can locally catch an exception 
and present an error-link which leads to a page containing
more information and a traceback.  Imagine you have to do this
with inline try-except clauses: you don't and then you get 
long meaningless tracebacks with hardly any context what went
wrong.  

With the aid of the __except__ hook you can still render 
the non-erranonous part of the page and give an immediate clue 
what went wrong and where.  So I think __except__ has the potential
to improve error-handling by abstracting it out into a method
instead of (redundantly) intermingling it with every thunk.

regards,

    holger