__except__ use cases (was: Re: [Python-Dev] PEP 310 and exceptions)

holger krekel hpk at trillke.net
Sat Apr 23 18:06:49 CEST 2005


On Sat, Apr 23, 2005 at 13:41 +1000, Nick Coghlan wrote:
> Nick Coghlan wrote:
> In light of Alex's comments, I'd actually like to suggest the below as a 
> potential new definition for PEP 310 (making __exit__ optional, and adding 
> an __else__ handler):
> 
>     if hasattr(x, '__enter__'):
>         x.__enter__()
>     try:
>         try:
>             # Contents of 'with' block
>         except:
>             if hasattr(x, '__except__'):
>                 if not x.__except__(*sys.exc_info()): # [1]
>                     raise

On a side note, I don't see too much point in having __except__ 
return something when it is otherwise easy to say: 

    def __except__(self, typ, val, tb): 
        self.abort_transaction() 
        raise typ, val, tb 

But actually i'd like to to mention some other than
transaction-use cases for __except__, for example with

    class MyObject: 
        def __except__(self, typ, val, tb): 
            if isinstance(val, KeyboardInterrupt): 
                raise 
            # process exception and swallow it

you can use it like: 

    x = MyObject(): 
        # do some long running stuff 

and MyObject() can handle internal problems appropriately and
present clean Exceptions to the outside without changing the
"calling side".  With my implementation i also played with
little things like: 
    
    def __getattr__(self, name): 
        Key2AttributeError: 
            return self._cache[key]
        ... 

with an obvious __except__() implementation for
Key2AttributeError.   

Similar to what Alex points out i generally think that being
able to define API/object specific exception handling in *one*
place is a great thing. I am willing to help with the PEP and 
implementation, btw.

cheers, 

    holger


More information about the Python-Dev mailing list